1 /* 2 從兩個字符串中找出最長的相同字符序列 3 */ 4 class Ex_4_11 5 { 6 public static void main(String[] args) 7 { 8 String str1 = "abchelHelouyouarmabc"; 9 String str2 = "You are my Hello abcd,hello"; 10 int str1s , substr1len; 11 String substr1; 12 boolean isSearched=false; 13 int l = str1.length(); 14 int n = 0; 15 16 while (l>=0) 17 { 18 n = n+l; 19 l--; 20 } // 累加,計算出str1字符串一共有n種可能的子字符串組合 21 22 //從這n種中尋找可能的字符串並截取出來與str2比較 23 Search: 24 for (substr1len=str1.length() ; substr1len >= 1 ; substr1len-- ) 25 { 26 for (str1s=0 ; str1s <=(str1.length() - substr1len) ; str1s++ ) 27 { 28 substr1 = str1.substring(str1s, (str1s+substr1len)); 29 //System.out.print(substr1+ " "); 30 if (str2.indexOf(substr1)>-1) 31 { 32 System.out.println("The max equals substring is :" + substr1); 33 isSearched = true; 34 } 35 } 36 if (isSearched) break; 37 } 38 39 // System.out.println(n); 40 } 41 } 42 43 /* 44 算法思路: 45 (1)計算可能的子字符串的數量; 46 (2)子串的長度substrlen范圍是1至str1.length(),而子串在str1中的起始位置0至(str1.length() - substrlen)。 47 那么就以子串的長度作為外層循環,子串在str1中的起始位置作為內層循環,開始遍歷所有可能的子串。因為該題要求是求出最長的相同子字符串, 48 所以最先從最長的子串長度開始遍歷,即substrlen = str.length(),依次減1; 49 子串的起始位置循環每一輪都從0開始 50 (3)利用String類的indexOf(String str)方法,找出第一個返回值不是-1的子串並輸出(indexOf()方法,如果沒有找到匹配的值就返回-1)。 51 此時循環不結束,繼續找,因為可能有長度一樣的其它子串還未被發現。 52 當找到最長相同的子串時,置標志位isSearched為true,在外層循環中判斷該標志位,如果已經找到了最長的子串,就沒必要繼續循環子串的長度,結束循環。 53 */