[leetcode 문제풀이 노트] Edit Distance

5522 단어 LeetCode
Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.)
You have the following 3 operations permitted on a word:
a) Insert a characterb) Delete a characterc) Replace a character
 
문제: 동적 기획 문제.
수조 dp[i][j]로word1[0,i]에서word2[0,j]로 바꾸는 데 필요한 최소 변환을 나타낸다.
그럼 dp[i][j]=word1(i)==word2(j)?dp[i-1][j-1]: min(dp[i-1,j], dp[i,j-1], dp[i-1,j-1])+1;
특히 주의해야 할 것은 첫 번째 줄과 첫 번째 열의 처리 문제다.한 가지 방법은 dp의 크기를 dp[word1.length+1][word2.length+1]로 설정한 다음에 dp[0][i]=dp[i][0]=i로 설정하여 빈 문자열에서 길이가 i인 문자열로 서로 변환하려면 적어도 i보가 필요하다는 것을 나타낸다.개인적으로 이것은 비교적 좋은 방법이라고 생각했지만 당시에는 생각하지 못했다.
내가 생각한 것은 또 다른 방법이었고, 게다가 이곳에서 오랫동안 구덩이에 빠졌다.행위 예: dp[0][i] = Math.max(dp[0][i-1] + (wordchars1[0]== wordchars2[i]?0:1),i);만약word1의 0자와word2의 i자와같다면 dp[0][i-1]보변환이 필요합니다.그러나 여기에는 문제가 하나 있다. 바로 word1="pneumu", word2="up"일 때, 이때 문자열'u'에서'pneum'으로 4단계가 필요하고, 계산에서'u'에서'pneumu'로 4단계가 필요하지만, 직접 dp[0][i-1]로 4단계가 필요하면 불가능하다. 두 문자열의 길이가 5단계, 적어도 5단계가 다르기 때문에 바깥의 max 함수 판단이 나온다.두 문자열이 서로 변환되는 최소 단계는 두 문자열의 길이보다 낮지 않습니다.
최종 코드는 다음과 같습니다.
 1 public class Solution {

 2     public int minDistance(String word1, String word2) {

 3         int m = word1.length();

 4         int n = word2.length();

 5         if(m == 0)

 6             return n;

 7         if(n == 0)

 8             return m;

 9         int[][] dp = new int[m][n];

10         

11         char[] wordchars1 = word1.toCharArray();

12         char[] wordchars2 = word2.toCharArray(); 

13         

14         dp[0][0] = wordchars1[0] == wordchars2[0]?0:1;

15         for(int i = 1;i < n;i++)

16             dp[0][i] = Math.max(dp[0][i-1] + (wordchars1[0]== wordchars2[i]?0:1),i);

17         for(int i = 1;i < m;i++)

18                dp[i][0] = Math.max(dp[i-1][0] + (wordchars1[i]== wordchars2[0]?0:1),i);

19         

20         for(int i = 1;i < m;i++){

21             for(int j = 1;j < n;j++){

22                 if(wordchars1[i] == wordchars2[j] )

23                     dp[i][j] = dp[i-1][j-1];

24                 else{

25                     dp[i][j] = 1 + Math.min(dp[i-1][j-1],Math.min(dp[i-1][j],dp[i][j-1]));

26                 }

27             }

28         }

29         

30         return dp[m-1][n-1];

31     }

32 }

좋은 웹페이지 즐겨찾기