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供您查看。