使用开始索引查找最长的公共子字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用开始索引查找最长的公共子字符串相关的知识,希望对你有一定的参考价值。

我看到了此代码实现here。它基本上需要两个字符串,找到最长的公共子字符串,然后返回其长度。我想对其稍加修改以获取每个单词的子字符串的起始索引,但无法弄清楚。我知道应该可行,因为我们正在处理字符串的索引。我将在下面编写代码的编辑版本:


public class Main {
    public class Answer {
        int i, j, len;
        Answer(int i, int j, int len) {
            this.i = i;
            this.j = j;
            this.len = len;
        }
    }
    public Answer find(String s1,String s2){

        int n = s1.length();
        int m = s2.length();

        Answer ans = new Answer(0, 0, 0);
        int[] a = new int[m];
        int b[] = new int[m];

        for(int i = 0;i<n;i++){
            for(int j = 0;j<m;j++){
                if(s1.charAt(i)==s2.charAt(j)){
                   if(i==0 || j==0 )a[j] = 1;
                   else{
                       a[j] = b[j-1] + 1;
                   }
                   ans.len = Math.max(ans.len, a[j]);
                   ans.i = i;
                   ans.j = j;
                }

            }
            int[] c = a;
            a = b;
            b = c;
        }
        return ans;
    }
}
答案
有两种解决方法:

解决方案1:

[这里,我创建了一个index数组,在其中存储两个字符串的起始索引,其中索引数组的索引0存储s1,索引1存储s2。

public Answer find(String s1,String s2){ int n = s1.length(); int m = s2.length(); Answer ans = new Answer(0, 0, 0); int[] a = new int[m]; int b[] = new int[m]; int indexes[] = new int[2]; for(int i = 0;i<n;i++){ for(int j = 0;j<m;j++){ if(s1.charAt(i)==s2.charAt(j)){ if(i==0 || j==0 )a[j] = 1; else{ a[j] = b[j-1] + 1; } if(a[j]>ans.len) { ans.len = a[j]; indexes[0]=(i+1) - ans.len; indexes[1]=(j+1) - ans.len; } ans.i = i; ans.j = j; } } int[] c = a; a = b; b = c; } return ans; }

解决方案2:

[我不确定您的Answer对象的i和j值在做什么,但是我们可以使它们很好地存储这些值,其中i存储s1字符串,j存储s2字符串,而不用创建不同的[C0 ]数组,如解决方案1所示。

index

以上是关于使用开始索引查找最长的公共子字符串的主要内容,如果未能解决你的问题,请参考以下文章

每日一题查找两个字符串中的最长公共子串

每日一题查找两个字符串中的最长公共子串

华为OJ081-查找两个字符串a,b中的最长公共子串

[LCS] nwHJ65 查找两个字符串a,b中的最长公共子串(LCS+KMP+substr暴力)

[LCS] nwHJ65 查找两个字符串a,b中的最长公共子串(LCS+KMP+substr暴力)

[LCS] nwHJ65 查找两个字符串a,b中的最长公共子串(LCS+KMP+substr暴力)