输出最长不重复子串
遇到过好几次这种类似的题了,只记得第一次是在阿里巴巴的笔试题中遇到的。
想了好久好久才想出来,下次再让我写我觉得我又写不出来了。
package test;
public class StrTest {
public static String longStr(String str) {
int maxLength=0;
char[] chs=str.toCharArray();
String resStr="";//最长不重复串
String resStr2="";//第二个最长不重复串,用作临时存储
boolean flag=true;//如果找到了最长串之后遇到重复字符最长串终止拼接,将flag置为false。然后继续找新的最长串
for(int i=0;i<str.length();i++) {
maxLength=resStr.length();
int k=resStr.indexOf(chs[i]+"");
if(k>=0) {//说明当前字符之前出现过
flag=false;
/*找到重复字符在当前已查找过的串中最后一次出现的位置,例如:qqqqq j的值为i-1 d=1*/
int j=str.substring(0,i).lastIndexOf(chs[i]);
int d=i-j;//当前不重复子串的长度
// System.out.println("i="+i+"j="+j+"d="+d);
if(d>=maxLength) {//else已经找到最长串,flag为false。如果d>=maxLength从新的位置开始截取
maxLength=d;
resStr+=chs[i];
resStr=resStr.substring(k+1, resStr.length());
flag=true;
}
}
else if(flag) {//当前字符本来就没出现过,或者重复后截取之后变为不重复的了,那么可以继续拼接
resStr+=chs[i];
}
/*如果找到了当前最大的串,那么应该先暂时把它记录下来,
* 然后继续向之后找最大的串,和之前最大的串做比较,如果长度比之前的还要大就将最长串的值进行更新*/
else {
resStr2=longStr(str.substring(i));
// System.out.println("str.substring(i)"+str.substring(i)+"----------resStr2"+resStr2);
if(resStr2.length()>resStr.length()) {
resStr=resStr2;
i=i+resStr.length();//
}
}
}
return resStr;
}
public static void main(String[] args) {
String str="aabcdfffghzdhkopsll";
System.out.println(longStr(str));//zdhkopsl
}
}