leetcode72——Edit Distance

题目大意:给出两个字符串,求出将其中一个变成另一个所需的最小操作数(最小距离),操作有三种——添加、删除、更换一个字符

分析:动规。

          状态:dp[i][j]——word1[0]到[i-1]和word2[0]到[j-1]的最小距离

          初始化:dp[i][0]=i(因为0~i-1是i个字符,需要在word2插入i个字符,最小距离为i)

                       dp[0][j]=j(同理)

          结果:dp[word1.size()][word2.size()]

          状态转移方程:如果word1[i-1]=word2[j-1],dp[i][j]=dp[i-1][j-1](因为不需要任何操作)

                                 如果word1[i-1]!=word2[j-1],dp[i][j]=min{dp[i-1][j],dp[i][j-1],dp[i-1][j-1]}+1({}中分别对应删除word1[i-1]处的字符、在word[i-1]后添加word2[j-1]字符、将word1[i-1]替换成word2[j-1])

代码:转载自https://segmentfault.com/a/1190000010512402

    public int minDistance(String word1, String word2) {
        if(word1.isEmpty()) return word2.length();
        if(word2.isEmpty()) return word1.length();
        int[][] steps = new int[word1.length()+1][word2.length()+1];
        for(int i = 0 ; i<=word1.length() ; i++){
            for(int j = 0 ; j<=word2.length() ; j++){
                if(i==0){
                    steps[i][j] = j;
                }else if(j==0){
                    steps[i][j] = i;
                }else if(word1.charAt(i-1) == word2.charAt(j-1)){
                    steps[i][j] = steps[i-1][j-1];
                 }else{
                     steps[i][j] = Math.min(Math.min(steps[i][j-1]+1, steps[i-1][j-1]+1), steps[i-1][j]+1);
                 }
                    
            }
        }
        return steps[word1.length()][word2.length()];
    }

猜你喜欢

转载自blog.csdn.net/tzyshiwolaogongya/article/details/80321882