행 편집 거리 Edit Distance - 동적 계획

1508 단어 알고리즘 학습

제목 설명:


소스 및 대상 열을 지정하여 소스 열을 다음과 같이 조작할 수 있습니다. 1.위치 설정에 문자를 삽입합니다.임의의 문자 바꾸기 3.임의의 문자 삭제
프로그램을 작성하여 최소 조작수를 되돌려줍니다. 이 조작을 하면 목표 직렬과 같고, 원본 직렬과 목표 직렬의 길이는 2000보다 작습니다.

아이디어:


상태 dp[i][j]를 설정하면 원본 직렬 s[0...i]와 목표 직렬 t[0...j]의 가장 짧은 편집 거리를 표시합니다
경계: dp[i][0] = i, dp[0][j] = j
점차적 방정식:
  • 만약에 s[i]=t[j]라면 dp[i][j]=dp[i-1][j-1]
  • 만약s[i]!=t[j], 그러면 세 가지 조작 상황이 있다.
  • s[i]를 삭제하고 dp[i][j]=dp[i-1][j]+1;
    s에 t[j], dp[i][j]=dp[i][j-1]+1 추가하기;
    s와 t를 교체하고 dp[i][j]=dp[i-1][j-1]+1;
    따라서 상태 전환 방정식을 작성할 수 있습니다.
    dp[i][j] = min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1] + (s[i]==t[j] ? 0 :1))
    각각 대응: 삭제, 추가, 교체(같으면 교체하지 않음)
    코드:
    class Solution {
    public:
        int minDistance(string word1, string word2) {
            int Slen = word1.size();
            int Tlen = word2.size();
            int dp[Slen+1][Tlen+1] = {0};//  :   +1,      0
            //   n     n+1   
            for(int i=1; i<=Slen; i++)  //   1  
                dp[i][0] = i;
            for(int j=1; j<=Tlen; j++)
                dp[0][j] = j;
            for(int i=1; i<=Slen; i++)
            {
                for(int j=1; j<=Tlen; j++)
                {
                    if(word1[i-1] == word2[j-1])
                        dp[i][j] = dp[i-1][j-1];
                    else
                    {
                        int temp = min(dp[i-1][j], dp[i][j-1]);
                        dp[i][j] = min(temp, dp[i-1][j-1]) + 1;
                    }
                }
            }
            return dp[Slen][Tlen];
        }
    };

    좋은 웹페이지 즐겨찾기