两个字符删除操作总结

1.两个字符串的删除操作

动态规划思路

这个思路和LCS不一样,主要是子问题的定义不一样。

  • 对于LCS来说,dp[i] [j]的意思其实就是前i字符串word1和前j的字符串word2最大的子序列数。
  • 对于这道题来说就是前i的word1和前j的word2最小的删除数。
  • 不同的定义自然处理也是不相同的。但是这两种解法看上去就是反面,如果需要删除的话那么就是+1如果不需要删除那么就是-1。对于最长子序列来说是只要相同那么就去+1。也就是这道题统计的是最小的删除数达到最大子序列,这就是他们相似的地方。
  • 你会发现在下面处理的方式,不就是反过来吗,如果相同那么不需要删除不操作,如果需要删除,那么看看到底删除谁,i还是j,并且参考前面计算出来的子问题得到当前问题的最小删除数

最后还是说说题目的解决思路

  • dp定义dp[i] [j],word1的前i个字符,word2前j个字符他们最小的删除数
  • 递推公式,如果word1[i]==word2[j]那么不需要删除dp[i] [j]=dp[i-1] [j-1],如果是不相同那么就是dp[i] [j]=max(dp[i-1] [j]+1,dp[i] [j-1]+1)也就是需要删i或者是删j。并且需要依靠前面的删除个数来得到当前的最小删除数。
  • 初始化,那么一开始肯定就是dp[i] [0]的时候如果需要相同就要删除i个,dp[0] [j]同理空字符串,那么相同的也只有可能是空的字符串
class Solution {
    
    
    public int minDistance(String word1, String word2) {
    
    
         int len1=word1.length();
         int len2=word2.length();
         int[][] dp=new int[len1+1][len2+1];
         
         for(int i=0;i<=len1;i++) dp[i][0]=i;
         for(int j=0;j<=len2;j++) dp[0][j]=j;
         

         for(int i=1;i<=len1;i++){
    
    
             for(int j=1;j<=len2;j++){
    
    
                 if(word1.charAt(i-1)==word2.charAt(j-1)){
    
    
                     dp[i][j]=dp[i-1][j-1];
                 }else{
    
    
                     dp[i][j]=Math.min(dp[i-1][j]+1,dp[i][j-1]+1);
                 }
             }
         }

         return dp[len1][len2];
        
    }
}

Guess you like

Origin blog.csdn.net/m0_46388866/article/details/120997674