最长不含重复字符的子字符串【双指针】
字符串一个经典的问题:求最长不含重复字符的子字符串,举例如下:
例如,在”abcabcbb”中,其无重复字符的最长子字符串是”abc”,其长度为 3;
又如,”bbbbb”,其无重复字符的最长子字符串为”b”,长度为1。
暴力法会产生三四个for循环,算法的复杂度太高不可取;那么,用动态规划吗?听着好高端,还没学习过的童鞋肿么办?木有门槛低一点好理解一点的方法么?哈哈,双指针了解一下。代码如下:
public class LongestSubStr {
public static String getLongestSubStr(String str){
if(str == null || str.length() <= 1){
return str;
}
String subMax = new String(str.substring(0,1));//默认就字符串第一个字符吧
HashSet<Character> set = new HashSet<>();//过滤重复内容,我想到了HashSet过滤
int p1 = 0;
int p2 = 1;
while (p2 < str.length()){
String sub = str.substring(p1, p2+1);//把这一段丢到set里,有木有更快点的方法?脑子不够用额
for(int i = 0; i < sub.length(); i++){
set.add(sub.charAt(i));
}
//这句话判断当前[p1, p2]位置的子字符串是否满足要求
if(set.size() != sub.length()){
//sub有重复:指针同时右移直到移出有重复区域
p1++;
p2++;
}else{
//sub没有重复:sub满足要求,更新subMax,只p2右移,看有没有更大的子字符串
//可以看出,如果有多个同等长度的子字符串,我们的方法中不会去一直更新,而是仅仅记录了第一个符合条件的子字符串。
subMax = sub;
p2++;
set.clear();
}
}
return subMax;
}
public static void main(String[] args) {
String str = "abcabcbb";
System.out.println(getLongestSubStr(str));
}
}