查找兩個字符串的最大公共子串
方法一:LCS
步驟:
1、根據兩個字符串長度構建一個同等長度的二維數組(假設字符串1作為行,字符串2作為列)
2、遍歷數據行列,比較兩個字符串在數組對應行列節點位置的字符是否相等,如果相等將數組這個位置的值設為左上角元素值+1(arry[i][j]+1),(第一行或第一列的元素需要置為1),這個數字代表了公共字符串的長度。
3、遍歷完成后將最后的兩個字符相等的位置的數字大小記錄下來作為公共串長度,將最后一次相等時行(列)下標記錄下來,作為字符串1子序列的起始位置(如果記錄的是列,則是字符串2子序列其實位置)。
實例:
String a="abcdf";
String b="rtbcdef";
/*查找公共子串*/ public String lastComStr(String str1, String str2) { /*公共串最大長度*/ int maxlen=0; /*公共串最后結束的位置*/ int endlen=0; int str1len=str1.length(); int str2len=str2.length(); int[][] arry=new int[str1len][str2len]; for (int i=0;i<str1len;i++){ for (int j=0;j<str2len;j++){ if (str1.charAt(i)==str2.charAt(j)){ if (0==i||j==0){ arry[i][j]=1; }else { /*arry[i][j]等左上角數字加一*/ arry[i][j]=1+arry[i-1][j-1]; } } if (maxlen<arry[i][j]){ maxlen=arry[i][j]; endlen=i; } } } /*[start,end) 字符串截取到start-end,調用substring(start,end+1)取出的字符串才是start-end的范圍 */ return str1.substring(endlen-maxlen+1,endlen+1); }
方法二:
步驟一:找出最短字符串
步驟二:找出最短字符串的全部子串,長度為1,2,3,4...n的,例如:a,b,c,d,f,ab,bc,cd,df,...。
步驟三:另一個字符串包含這些子串的最長的那一個。