最长公共子数组

  • 公共子串长度问题。

  • 要连续的,而非断续

  • 代码

    class Solution {
     public int findLength(int[] A, int[] B) {
          int n = A.length;
          int m = B.length;
          int f[][] = new int [n+1][m+1];
          int ans = 0 ;
          for(int i = 0; i < n ; i++) {  //最长公共子数组
              for(int j = 0 ; j < m ; j++) {
                  if(A[i]==B[j]) {
                      f[i+1][j+1] =  f[i][j]+1;//只能由斜上角的值决定
                  }
                  else {
                      f[i+1][j+1] = 0;  //本想传递给下一个 结果发现传递反而影响结果
                  }
                  ans = Math.max(ans,f[i+1][j+1]);
              }
    
          }
         // for(int i = 1 ; i<=n;i++){
         //     for(int j = 1 ; j <= m ;j++){
         //         System.out.print(f[i][j]+" ");
         //     }System.out.println();
         // }
          return ans;
    
      }
    }

最长公共子序列

 class Solution {
    public int minDistance(String word1, String word2) {
        char w1[] = word1.toCharArray();
        char w2[] = word2.toCharArray();
        int n = w1.length;
        int m = w2.length;
        int f[][] = new int [n+1][m+1];
        for(int i = 0 ; i < n ; i++) {
            for(int j = 0 ; j < m ; j++) {
                if(w1[i]==w2[j])
                    f[i+1][j+1] = f[i][j]+1;//Math.max(f[i+1][j+1-1], f[i+1-1][j+1-1])+1;//只能是斜上角 用相邻的话自己的位置算了两次
                else 
                    f[i+1][j+1] = Math.max(f[i+1][j+1-1],f[i+1-1][j+1]);

            }
        }
         // for(int i = 0 ; i<=n;i++){
         // for(int j = 0 ; j <= m ;j++){
         //     System.out.print(f[i][j]+" ");
         //    }System.out.println();
         // }
        return (m+n)-2*f[n][m];
    }
}