兩個字串中匹配最大字串
(實現二)
給出兩個字串,用自己最熟悉的程式語言找出兩個字串中匹配最長的字串。如:“ascdefd”和“mntrcdefpk”則匹配出的最大字串為:cdef。
package com.stringSub;
public class SubString {public static void main(String[] args) {
/*
* 使用執行緒,可以啟用兩個執行緒進行匹配,一個是從頭開始,一個從尾部開始,for迴圈的界限當然就是中間啦。
* */
// GetStringThread thread = new GetStringThread("pm","mncdepk");
// thread.start();
SubString sub = new SubString();
String maxStr = sub.SubStr("cdepk", "mncdepk");
System.out.println(maxStr);
}
public String SubStr(String str1,String str2){
//使用最短的字串去分割,可以實現效率更優。
String bigStr = str1.length() > str2.length() ? str1 : str2;
String smaStr = str1.length() > str2.length() ? str2 : str1;
String maxStr = "";
//對短的字串先進行逐個分割。
for (int i = 0; i < smaStr.length(); i++) {
String temp = smaStr.substring(i, i + 1);
if (bigStr.indexOf(temp) != -1) {//如果第一個字元匹配上,則開始往後匹配。
String temTest = smaStr.substring(i, smaStr.length());
if (maxStr.length() < temp.length())
maxStr = temp;
int k = 1;
while (k < temTest.length()) {
k++;
String strT = temTest.substring(0, k);
//如果出現匹配不上了,說明增加最後一個字元之後就匹配不上了,那麼增加最後一個之前都還能匹配。
if (bigStr.indexOf(strT) == -1) {
maxStr = strT.substring(0, k - 1);
break;
} else if (k == temTest.length()) {
/*
* 如果匹配到最後沒有字串了還是能匹配上,說明從開始進入迴圈到最後一個字元都能匹配。
* 其實在這裡還可以優化一下程式。就是程式匹配到最後一個字串了,那麼外層的for迴圈就沒必要再做了。
* */
if (bigStr.indexOf(temTest) != -1) {
if (maxStr.length() < temTest.length())
maxStr = temTest;
}
}
}
}
}
return maxStr;
}
}