(实现二)
给出两个字符串,用自己最熟悉的编程语言找出两个字符串中匹配最长的字符串。如:“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;
}
}