JAVA学习-----String类的算法题(题目来源尚硅谷)
获取两个字符串中最大相同子串。比如:
str1=“abcwerthelloyuiodef” ; str2=“cvhellobnm”
import java.util.ArrayList;
import java.util.Collection;
import java.util.Vector;
public class IntersectionTest {
public static void main(String[] args) {
IntersectionTest t=new IntersectionTest();
t.test();
}
/*
* 利用双指针的思想解决此问题,先让左指针固定不动,然后移动右指针。右指针指向的字符如果是连续存在的,则继续移动;
* 而当右指针指向的元素在长的字符串中找不到的话,左指针与右指针重合,重新查找
*/
public void test() {
int ans=0;
int max=0;
String str1="abcwerthelloyuiodef";
String str2="cvhellobnm";
if(str1.length()<str2.length()) { //为了便于比较,将长度较长的字符串作为被查询的一方
String s;
s=str1;
str1=str2;
str2=s;
}
char []c=str2.toCharArray();
Vector vec=new Vector(); //创建一个容器,因为容器的长度是动态的,在查找过程我们无法确定字符串的长度
int left=0;
int right=0;
int start = 0,end=0; //用来记录最大相同字串的起始位置和末位置
while(right<str2.length()) {
vec.add(c[right]); //将元素插入到容器中
right++; //右指针向后移动
char []c1=new char[vec.size()];
for(int j=0;j<vec.size();j++) {
c1[j]=(char)vec.elementAt(j);//将容器中的数据复制给字符数组
}
String str=new String(c1); //将字符数组转化为字符串
if(str1.contains(str)) {
ans++;
if(ans>max) {
start=left;
end=right;
}
}else {
left=right;
vec.add(left);
vec.clear(); //不要忘记要将容器中的数据清除,重新添加数据
}
}
System.out.println(str2.substring(start,end));
}
}