编程语言
首页 > 编程语言> > Java:如何比较两个字符串以获得它们不同的部分?

Java:如何比较两个字符串以获得它们不同的部分?

作者:互联网

我想学习一种获取两个字符串不同的部分的方法.

假设我有这两个字符串:

String s1 = "x4.printString(\"Bianca.()\").y1();";
String s2 = "sb.printString(\"Bianca.()\").length();";

我希望这个输出:[“x4”,“y1”,“sb”,“length”]来自接收s1和s2as参数的方法.

我在其他帖子中找到了类似的东西,但我只找到了StringUtils.difference(String first, String second)的链接.

但是这个方法从索引开始返回第二个字符串,它开始与第一个字符串不同.
我真的不知道从哪里开始,任何建议都会非常感激.

UPDATE
在@aUserHimself建议之后,我设法获得了两个字符串中的所有常见子序列,但这些子序列就像一个唯一的字符串.

这是我现在的代码:

private static int[][] lcs(String s, String t) {
    int m, n;
    m = s.length();
    n = t.length();
    int[][] table = new int[m+1][n+1];
    for (int i=0; i < m+1; i++)
        for (int j=0; j<n+1; j++)
            table[i][j] = 0;
    for (int i = 1; i < m+1; i++)
        for (int j = 1; j < n+1; j++)
            if (s.charAt(i-1) == t.charAt(j-1))
                table[i][j] = table[i-1][j-1] + 1;
            else
                table[i][j] = Math.max(table[i][j-1], table[i-1][j]);
    return table;
}

private static List<String> backTrackAll(int[][]table, String s, String t, int m, int n){
    List<String> result = new ArrayList<>();
    if (m == 0 || n == 0) {
        result.add("");
        return result;
    }
    else
        if (s.charAt(m-1) == t.charAt(n-1)) {
            for (String sub : backTrackAll(table, s, t, m - 1, n - 1))
                result.add(sub + s.charAt(m - 1));
            return result;
        }
        else {
            if (table[m][n - 1] >= table[m - 1][n])
                result.addAll(backTrackAll(table, s, t, m, n - 1));
            else
                result.addAll(backTrackAll(table, s, t, m - 1, n));
            return result;
        }
}

private List<String> getAllSubsequences(String s, String t){
    return backTrackAll(lcs(s, t), s, t, s.length(), t.length());
}

在这两个字符串上调用getAllSubsequences:

String s1 = "while (x1 < 5)"
String s2 = "while (j < 5)"

我收到这个字符串:[“while(< 5)”]不是[“while(”,“< 5)”],因为我想获得.我不明白我做错了什么.

解决方法:

找到两个字符串之间最长的公共子序列.
之后,您可以使用indexOf在两个字符串之间获取此公共字符串的索引,并从两者中获取不常见的值.

例如:

CICROSOFK
WOCROSFGT

常见的信是

CROS

找到从0到SOFT索引的不同字符串,从索引’SOFT’.length到str.length

标签:java,string-comparison,string
来源: https://codeday.me/bug/20190701/1350619.html