检查两个字符串是否包含类似的子字符串

时间:2016-02-22 02:59:09

标签: java string

我正在尝试编写一个程序,该程序的一部分是找到两个字符串之间的相似性。你问用户字符串中应该有多少相似的字母。

例如:

string1 = aghilfamjijasrnlklk;
string2 = dfdfkkjhklkfnajnvfo;

用户类型3,

程序打印:

klk is similar in both 
starts at index 16, ends at 19 in string 1
starts at index 8, ends at 11 in string 2

我尝试过:

for (int i = 0; i <= search; i++) {
        if (string1.regionMatches(i, string2, 0, substringlength)) {
            found = true;
            System.out.print("Match found!");

            break;


        }
    }

我会做得更多,但我完全停滞不前,不知道该怎么办;我在编码时相当新。

1 个答案:

答案 0 :(得分:0)

我猜这样做的方法是使用LCS算法(最长公共子序列),最后只需要算法给你的第一个X量的Chars。 (当然,这不是计算最快的算法,但算法几乎完全由其他人编写)

作为一个例子,LCS(计算机,uouthgr)会给你一个字符串值“outr”,如果用户只想要3个字符给他subString为“out”。

以下是我在网上找到的LCS代码(需要进行修改以达到您的目的):

公共类LCS {

public static void main(String[] args) {
    String x = StdIn.readString();
    String y = StdIn.readString();
    int M = x.length();
    int N = y.length();

    // opt[i][j] = length of LCS of x[i..M] and y[j..N]
    int[][] opt = new int[M+1][N+1];

    // compute length of LCS and all subproblems via dynamic programming
    for (int i = M-1; i >= 0; i--) {
        for (int j = N-1; j >= 0; j--) {
            if (x.charAt(i) == y.charAt(j))
                opt[i][j] = opt[i+1][j+1] + 1;
            else 
                opt[i][j] = Math.max(opt[i+1][j], opt[i][j+1]);
        }
    }

    // recover LCS itself and print it to standard output
    int i = 0, j = 0;
    while(i < M && j < N) {
        if (x.charAt(i) == y.charAt(j)) {
            System.out.print(x.charAt(i));
            i++;
            j++;
        }
        else if (opt[i+1][j] >= opt[i][j+1]) i++;
        else                                 j++;
    }
    System.out.println();

}

}

有关详细信息,我建议您阅读: https://en.wikipedia.org/wiki/Longest_common_subsequence_problem

但如果你像我一样,我会建议更多人在youtube上寻找关于这个主题的视频!