leetcode72 편집 거리

여기에 사진 설명 삽입
오른쪽 하단 모서리의 값이 최종 필수 값입니다.

동적 프로그래밍 의 개념

정의 dp [i] [j]
21. dp [i] [j]는 word1의 처음 i 개 문자를 나타내며 word2에서 처음 j 개 문자로 변환되어
필요한 작업의 최단 수 22. word1 또는 word2가 수행하는지 고려할 필요가 있습니다. 문자가 없습니다. 즉, 모든 추가 / 삭제 상황이므로 dp [0] [j] 및 dp [i] [0]을 예약하십시오.

상태 전이
31. 증가, dp [i] [j] = dp [i] [j-1] + 1
32. 삭제, dp [i] [j] = dp [i-1] [j] + 1
33. 변경, dp [i] [j] = dp [i-1] [j-1] + 1
34. dp [i] [j], dp [i-1] [j], dp 계산시 순서대로 계산 [i] [j-1], dp [i-1] [j-1]이 결정되었습니다.
35.이 세 가지 작업의 추가, 삭제 및 수정으로 인해 작업 수를 1 씩 늘리려면 해당 dp가 필요합니다. 그리고 세 최소 소요
두 문자가 같은 word1로 될 일 경우 36 [I-1] = word2 후 직접 참조 할 수있다 [-1 j]가 DP와 [I-1] [J-1] 작업에 추가하지 않고

저자 : ikaruga
링크 : https : //leetcode-cn.com/problems/edit-distance/solution/edit-distance-by-ikaruga/
출처 : 스테이 버튼 (LeetCode)
저작권은 저자에게 있습니다. 상업적 재판의 경우 저자에게 연락하여 승인을 받고 비상업적 재판의 경우 출처를 표시하십시오.

여기에 사진 설명 삽입
하향식 :

public static int minDistance(String word1,String word2){
    
    
        int n1 = word1.length();
        int n2 = word2.length();

        int[][] dp = new int[n1+1][n2+1];

       //初始化 如果i或j两者中其中一个为零,则对word1一直执行删除操作或一直执行插入操作,且此时不能使用该关系式
        for (int j = 1;j <= n2;j++){
    
    
            dp[0][j] = dp[0][j-1]+1;
        }
        for (int i = 1;i <= n1;i++){
    
    
            dp[i][0] = dp[i-1][0]+1;
        }

        //将从0-i的字符转换成0-j的字符
        for (int i = 1;i <= n1;i++){
    
    
            for (int j = 1;j <= n2;j++){
    
    
                //如果word1[i]和word2[j]相等,第i个字符对应下标是i-1;
                if (word1.charAt(i-1) == word2.charAt(j-1)){
    
    
                    dp[i][j] = dp[i-1][j-1];
                }else {
    
    
                    //分别是删除,插入,替换操作。
                    dp[i][j] = Math.min(Math.min(dp[i-1][j-1],dp[i][j-1]),dp[i-1][j])+1;
                }
            }
        }
        return dp[n1][n2];
    }

원본 링크

추천

출처blog.csdn.net/weixin_45773632/article/details/109500405