美文网首页数据结构与算法
编辑距离--最长公共子串长度

编辑距离--最长公共子串长度

作者: 暮想sun | 来源:发表于2020-01-10 15:24 被阅读0次

    最长公共子串作为编辑距离中的一种,只允许增加、删除字符两种编辑操作。
    最长公共子串的大小,表示两个字符串相似程度的大小。

    从 a[0] 和 b[0] 开始,依次考察两个字符串中的字符是否匹配。
    如果 a[i] 与 b[j] 互相匹配,我们将最大公共子串长度加一,并且继续考察 a[i+1] 和 b[j+1]。
    如果 a[i] 与 b[j] 不匹配,最长公共子串长度不变,这个时候,有两个不同的决策路线:
    删除 a[i],或者在 b[j] 前面加上一个字符 a[i],然后继续考察 a[i+1] 和 b[j];
    删除 b[j],或者在 a[i] 前面加上一个字符 b[j],然后继续考察 a[i] 和 b[j+1]。
    反过来也就是说,如果我们要求 a[0…i] 和 b[0…j] 的最长公共长度 max_lcs(i, j),我们只有可能通过下面三个状态转移过来:
    (i-1, j-1, max_lcs),其中 max_lcs 表示 a[0…i-1] 和 b[0…j-1] 的最长公共子串长度;
    (i-1, j, max_lcs),其中 max_lcs 表示 a[0…i-1] 和 b[0…j] 的最长公共子串长度;
    (i, j-1, max_lcs),其中 max_lcs 表示 a[0…i] 和 b[0…j-1] 的最长公共子串长度。

    
    public int lcs(char[] a, int n, char[] b, int m) {
      int[][] maxlcs = new int[n][m];
      for (int j = 0; j < m; ++j) {//初始化第0行:a[0..0]与b[0..j]的maxlcs
        if (a[0] == b[j]) maxlcs[0][j] = 1;
        else if (j != 0) maxlcs[0][j] = maxlcs[0][j-1];
        else maxlcs[0][j] = 0;
      }
      for (int i = 0; i < n; ++i) {//初始化第0列:a[0..i]与b[0..0]的maxlcs
        if (a[i] == b[0]) maxlcs[i][0] = 1;
        else if (i != 0) maxlcs[i][0] = maxlcs[i-1][0];
        else maxlcs[i][0] = 0;
      }
      for (int i = 1; i < n; ++i) { // 填表
        for (int j = 1; j < m; ++j) {
          if (a[i] == b[j]) maxlcs[i][j] = max(
              maxlcs[i-1][j], maxlcs[i][j-1], maxlcs[i-1][j-1]+1);
          else maxlcs[i][j] = max(
              maxlcs[i-1][j], maxlcs[i][j-1], maxlcs[i-1][j-1]);
        }
      }
      return maxlcs[n-1][m-1];
    }
    
    private int max(int x, int y, int z) {
      int maxv = Integer.MIN_VALUE;
      if (x > maxv) maxv = x;
      if (y > maxv) maxv = y;
      if (z > maxv) maxv = z;
      return maxv;
    }
    

    相关文章

      网友评论

        本文标题:编辑距离--最长公共子串长度

        本文链接:https://www.haomeiwen.com/subject/wozpactx.html