algorithm
Edytuj algorytm dynamiczny odległości
Szukaj…
Wymagane są minimalne zmiany w celu konwersji ciągu 1 na ciąg 2
Opis problemu wygląda tak, jakbyśmy otrzymali dwa łańcuchy str1 i str2, a następnie ile minimalnej liczby operacji można wykonać na str1, który zostanie przekonwertowany na str2. Operacje mogą być:
- Wstawić
- Usunąć
- Zastąpić
Na przykład
Input: str1 = "geek", str2 = "gesek"
Output: 1
We only need to insert s in first string
Input: str1 = "march", str2 = "cart"
Output: 3
We need to replace m with c and remove character c and then replace h with t
Aby rozwiązać ten problem, użyjemy tablicy 2D dp [n + 1] [m + 1], gdzie n jest długością pierwszego łańcucha, a m jest długością drugiego łańcucha. W naszym przykładzie, jeśli str1 to azcef, a str2 to abcdef, wówczas naszą tablicą będzie dp [6] [7], a nasza ostateczna odpowiedź zostanie zapisana w dp [5] [6].
(a) (b) (c) (d) (e) (f)
+---+---+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 |
+---+---+---+---+---+---+---+
(a)| 1 | | | | | | |
+---+---+---+---+---+---+---+
(z)| 2 | | | | | | |
+---+---+---+---+---+---+---+
(c)| 3 | | | | | | |
+---+---+---+---+---+---+---+
(e)| 4 | | | | | | |
+---+---+---+---+---+---+---+
(f)| 5 | | | | | | |
+---+---+---+---+---+---+---+
W przypadku dp [1] [1] musimy sprawdzić, co możemy zrobić, aby przekonwertować plik na a . Będzie to 0. Dla dp [1] [2] musimy sprawdzić, co możemy zrobić, aby przekonwertować plik na ab. To. będzie wynosić 1, ponieważ musimy wstawić b . Więc po 1. iteracji będzie wyglądać nasza tablica
(a) (b) (c) (d) (e) (f)
+---+---+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 |
+---+---+---+---+---+---+---+
(a)| 1 | 0 | 1 | 2 | 3 | 4 | 5 |
+---+---+---+---+---+---+---+
(z)| 2 | | | | | | |
+---+---+---+---+---+---+---+
(c)| 3 | | | | | | |
+---+---+---+---+---+---+---+
(e)| 4 | | | | | | |
+---+---+---+---+---+---+---+
(f)| 5 | | | | | | |
+---+---+---+---+---+---+---+
Do iteracji 2
W przypadku dp [2] [1] musimy sprawdzić, czy aby przekonwertować az na a , musimy usunąć z , stąd dp [2] [1] będzie wynosić 1. Podobnie dla dp [2] [2] musimy zastąpić z z b , stąd dp [2] [2] będzie wynosić 1. Więc po 2. iteracji będzie wyglądała nasza tablica dp [] .
(a) (b) (c) (d) (e) (f)
+---+---+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 |
+---+---+---+---+---+---+---+
(a)| 1 | 0 | 1 | 2 | 3 | 4 | 5 |
+---+---+---+---+---+---+---+
(z)| 2 | 1 | 1 | 2 | 3 | 4 | 5 |
+---+---+---+---+---+---+---+
(c)| 3 | | | | | | |
+---+---+---+---+---+---+---+
(e)| 4 | | | | | | |
+---+---+---+---+---+---+---+
(f)| 5 | | | | | | |
+---+---+---+---+---+---+---+
Tak będzie wyglądać nasza formuła
if characters are same
dp[i][j] = dp[i-1][j-1];
else
dp[i][j] = 1 + Min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1])
Po ostatniej iteracji będzie wyglądała nasza tablica dp []
(a) (b) (c) (d) (e) (f)
+---+---+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 |
+---+---+---+---+---+---+---+
(a)| 1 | 0 | 1 | 2 | 3 | 4 | 5 |
+---+---+---+---+---+---+---+
(z)| 2 | 1 | 1 | 2 | 3 | 4 | 5 |
+---+---+---+---+---+---+---+
(c)| 3 | 2 | 2 | 1 | 2 | 3 | 4 |
+---+---+---+---+---+---+---+
(e)| 4 | 3 | 3 | 2 | 2 | 2 | 3 |
+---+---+---+---+---+---+---+
(f)| 5 | 4 | 4 | 2 | 3 | 3 | 3 |
+---+---+---+---+---+---+---+
Implementacja w Javie
public int getMinConversions(String str1, String str2){
int dp[][] = new int[str1.length()+1][str2.length()+1];
for(int i=0;i<=str1.length();i++){
for(int j=0;j<=str2.length();j++){
if(i==0)
dp[i][j] = j;
else if(j==0)
dp[i][j] = i;
else if(str1.charAt(i-1) == str2.charAt(j-1))
dp[i][j] = dp[i-1][j-1];
else{
dp[i][j] = 1 + Math.min(dp[i-1][j], Math.min(dp[i][j-1], dp[i-1][j-1]));
}
}
}
return dp[str1.length()][str2.length()];
}
Złożoność czasu
O(n^2)