无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
样例输入:
"abcabcbb"
"bbbbb"
"pwwkew"
"ohvhjdml"
"dvdf"
"aab"
样例输出:
3
1
3
6
3
2
方法一:
暴力破解,通过循环,所有长度为1的字串,依次判断是否元素重复(显然没有),所有长度为2的所有子串,依次判断是否元素重复,所有长度为3.字串。。。
class Solution {
public int lengthOfLongestSubstring(String s) {
int maxLength = 0;
for(int i =0 ;i<s.length();i++) {
for(int j = 0;j<s.length()-i;j++) {
String sub = s.substring(j, j+1+i);
Set <Character> set = new HashSet<Character>();
for(int m = 0;m<sub.length();m++) {
set.add(new Character(sub.charAt(m)));
}
if(set.size()!=sub.length()) continue;
maxLength = Math.max(sub.length(), maxLength);
}
}
return maxLength;
}
}
方法二:
滑动窗口
例如将字符串ohvhjdml,从头o开始放入队列,每次放入前判断是否存在重复元素。
直至当队列中有了ohv时,再次放入下一个元素h时,判断到有重复元素,去掉o;
此时队列为hv,再次放h,又判断到重复元素,移去了头元素h;
此时队列中有v,再次放h,放入成功…
就有点像一个窗口在字符串ohvhjdml上从左滑动,当碰到有重复元素时就一直移除头部元素,直到元素不重复就继续往后滑。
class Solution {
public int lengthOfLongestSubstring(String s) {
Queue<Character> que = new LinkedList<Character>();
int maxLength = 0;
for(int i = 0 ;i<s.length();i++) {
while(que.contains(new Character(s.charAt(i)))) {
que.poll();
}
que.offer(s.charAt(i));
maxLength = Math.max(maxLength, que.size());
}
return maxLength;
}
}