最長無重復(fù)字符的子串
給定一個字符串粘都,找出不含有重復(fù)字符的最長子串的長度。
示例:
給定 "abcabcbb" 浩习,沒有重復(fù)字符的最長子串是 "abc" 同辣,那么長度就是3工坊。
給定 "bbbbb" ,最長的子串就是 "b" 恋拷,長度是1资厉。
給定 "pwwkew" ,最長子串是 "wke" 蔬顾,長度是3宴偿。請注意答案必須是一個子串湘捎,"pwke" 是 子序列 而不是子串。
實現(xiàn)思路
初始化hashSet
設(shè)定左指針left和右指針right窄刘,right從左向右遍歷
判斷元素在hashSet容器是否存在窥妇,如果不存在,則將元素放在容器中娩践,并且計算length的大小活翩,和max比較取最大值
如果已經(jīng)存在,則從將left指針移到當(dāng)前元素翻伺,并且將該元素左邊的全部元素移除
重復(fù)上面的判斷材泄,直到全部遍歷
總體有種類似滑窗的設(shè)計思想,有左右兩個手柄吨岭,一個先滑動拉宗,當(dāng)遇到和之前相同的XX,后一個也移到此位置辣辫,想起讓子彈飛的一句旦事,他跑我就追~
具體實現(xiàn)
public class Solution {
@Test
public void testSubStr(){
System.out.println(maxSubstring("12334"));
}
public int maxSubstring(String s) {
int n = s.length();//數(shù)組大小
Set<Character> set = new HashSet<>();
int max = 0, left= 0, right = 0;
while (left< n && right < n) {
if (!set.contains(s.charAt(left))){//判斷set集合中是否存在
set.add(s.charAt(right++));//加到集合中
max = Math.max(max, right - left);//取區(qū)間大的
}
else {
set.remove(s.charAt(left++));//注意當(dāng)出現(xiàn)重復(fù)元素的時候,該元素左邊的數(shù)據(jù)全部移除急灭,并且將left移到當(dāng)前的元素位置族檬。
}
}
return max;
}
}