w1과 w2라는 두 단어가 있다고 가정하면 w1과 w2를 동일하게 만드는 데 필요한 최소 단계 수를 찾아야 합니다. 여기서 각 단계에서 각 문자열에서 한 문자를 삭제할 수 있습니다. . 따라서 입력이 "sea" 및 "eat"와 같으면 출력은 2가 됩니다. w1에서 's'를 삭제해야 하기 때문에 이것은 "ea"가 되고 w2에서 "eat"에서 "t"가 삭제됩니다. 그렇다면 그들은 동일합니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다.
- n :=s1의 크기, m :=s2의 크기
- 문자열 s1 및 s2 앞에 공백 하나를 추가한 다음 그에 따라 s1 및 s2를 업데이트합니다.
- (n + 1) x (m + 1) 크기의 테이블 하나 만들기
- i :=1 ~ m
- dp[0, i] :=dp[0, i - 1] + 1
- i:=1 ~ n
- dp[i, 0] :=dp[i – 1, 0] + 1
- 1~n
- 범위의 i에 대해
- 1 ~ m
- 범위의 j에 대해
- s1[i] =s2[j]
- 인 경우
- dp[i, j] :=dp[i – 1, j – 1]
- else dp[i, j] =dp[i – 1, j] + 1 및 dp[i, j - 1] + 1의 최소값
- s1[i] =s2[j]
- 1 ~ m
- dp[n, m]을 반환
예(C++)
더 나은 이해를 위해 다음 구현을 살펴보겠습니다. −
#include <bits/stdc++.h> using namespace std; class Solution { public: int minDistance(string s1, string s2) { int n = s1.size(); int m = s2.size(); s1 = " " + s1; s2 = " " + s2; vector < vector <int> > dp(n + 1, vector <int>(m + 1)); for(int i = 1; i <= m; i++){ dp[0][i] = dp[0][i - 1] + 1; } for(int i = 1; i <= n; i++){ dp[i][0] = dp[i - 1][0] + 1; } for(int i = 1; i <= n; i++){ for(int j = 1; j <= m; j++){ if(s1[i] == s2[j]){ dp[i][j] = dp[i - 1][j - 1]; } else{ dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1); } } } return dp[n][m]; } }; main(){ Solution ob; vector<int> v = {1,1,1}; cout << (ob.minDistance("sea", "eat")); }
입력
"sea" "eat"
출력
2