2011-11-19 89 views
4

我想智能地連接用戶輸入,以便它刪除重複的子字符串以下面的方式。如何inteligently concat兩個字符串,以便忽略重複的子字符串

  • 不安+ easyly = uneasyly
  • 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 

有沒有更好的方法來做到這一點?

回答

7

你的錯誤是在該行

s = s1+common+s2.substring(L); 

你是串聯整個的S1加上公共部分,它已經包含在S1。嘗試改變它

s = s1+s2.substring(L); 

它應該工作(雖然沒有測試)。

+0

得愛當有人張貼了同樣的事情,而你寫了答案......幹得好男人:) – Lucas

+0

感謝您能否讓我知道是否有更好的方式來進行連接? – hiran

3

這條線是你的問題:

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; 

請注意,這是未經測試,但橫跨得到算法中...


只是想的一件事,如果你這樣做,你可以使前相比,1比2的長度的長度通過選擇在外部循環中迭代哪個更有效。例如,如果s2比s1短,您可以通過outter循環中s2的2個字符串的末尾向後迭代來看到性能改進(無論是輕微的)。可能不值得,但你要求更多的建議...

+0

非常感謝... – hiran

+0

@hiran,我添加了一個建議的算法,讓你檢查出來。 – Lucas

4
s = s1+common+s2.substring(L); 

問題是,共同包含s1已經。這就是爲什麼你得到兩個共同的字符串。

但是,算法沒有下更常見的情形工作 uneasyly + easytogo = uneasylytogo

+0

非常感謝... – hiran

+0

你有什麼建議嗎? – hiran

+0

如此接近你得到的,你真的需要嘗試自己。 – ComfortablyNumb