Java 如何智能地合并两个字符串以忽略重复的子字符串

Java 如何智能地合并两个字符串以忽略重复的子字符串,java,string-concatenation,Java,String Concatenation,我想智能地连接用户输入,以便以以下方式删除重复的子字符串 不安的 concat+催化剂=concatalyst 这就是我正在努力做的,无法找出遗漏了什么 public class Concater { public String concat(String s1, String s2) { String s = s1; int L = s2.length(); while (L > 0) { String

我想智能地连接用户输入,以便以以下方式删除重复的子字符串

  • 不安的
  • concat+催化剂=concatalyst
这就是我正在努力做的,无法找出遗漏了什么

public class Concater {
    public String concat(String s1, String s2) {

        String s = s1;
        int L = s2.length();
        while (L > 0) {
            String common = s2.substring(0, L);
            if (s1.endsWith(common)) {
                s = s1+common+s2.substring(L);
                break;
            }
            L--;
        }

        return s;
    }

    public static void main(String[] args) {
        Concater c = new Concater();
        System.out.println(c.concat("uneasy", "easyly")+"|expected:uneasyly");
        System.out.println(c.concat("concat", "catalyst")+"|expected:concatalyst");
    }

}
输出

uneasyeasyly|expected:uneasyly
concatcatalyst|expected:concatalyst

有更好的方法吗?

你的错误在所难免

s = s1+common+s2.substring(L);
您将连接整个s1加上已包含在s1中的公共部分。试着把它改成

s = s1+s2.substring(L);

而且它应该可以工作(不过没有经过测试)。

这一行是你的问题:

s = s1+common+s2.substring(L);
应该是:

s = s1+s2.substring(L);

由于您正在寻求一种更好的方法来执行此操作,因此遍历字符的速度可能要快得多:

int i = 0;
for ( s1Length = s1.length; i < s1.length(); i++ ) {
    if ( s1.charAt( i ) == s2.charAt( 0 ) {
        boolean matches = true;
        for ( int j = i, k = 0, remaining = s1.length - i; k < remaining; k++, j++ ) {
            if ( s1.charAt( j ) == s2.charAt( k ) ) {
                matches = false;
                break;
            }
        }
        if ( matches ) {
            break;
        }
    }
}
s = s1.substring( 0, i ) + s2;
inti=0;
对于(s1Length=s1.length;i
请注意,这是未经测试,但得到的算法通过


再考虑一件事,如果在执行此操作之前比较1的长度和2的长度,您可以通过选择在外部循环中迭代哪个来提高效率。例如,如果s2比s1短,您可以看到性能改进(无论多么轻微)通过在outter循环中从2个字符串的末尾向后迭代s2。可能不值得,但您要求提供更多建议

 s = s1+common+s2.substring(L);
问题是公共字符串已经包含在s1中。这就是为什么会得到两个公共字符串

但是,您的算法在更常见的情况下不起作用
不安+easytogo=不安+easytogo

当你在写答案的时候,有人发布了完全相同的东西,你一定会喜欢的……干得好的人:)谢谢你能告诉我是否有更好的方法进行连接吗?你有什么建议吗?这么接近你得到的,你真的需要自己尝试一下。@hiran,我添加了一个建议的algo供您查看。