leetcode :不含有重复字符的 最长子串 的长度
本题可以使用滑动窗口算法
这道题主要用到思路是:滑动窗口
什么是滑动窗口?
其实就是一个队列,比如例题中的 abcabcbb,进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满足要求。所以,要移动这个队列!
只要把队列的左边的元素移出就行了,直到满足题目要求!
一直维持这样的队列,找出队列出现最长的长度时候,求出解!
时间复杂度:O(n)
public int lengthOfLongestSubstring(String s) {
StringBuffer subs = new StringBuffer();
int len = 0;//字串长度
for(int i = 0; i<s.length();i++){
//判断字符是否在subs 中
if(String.valueOf(subs).contains(String.valueOf(s.charAt(i)))){
while(subs.charAt(0) != s.charAt(i)){
subs.deleteCharAt(0);
}
subs.deleteCharAt(0);
subs.append(s.charAt(i));
}else {
subs.append(s.charAt(i));
len = Math.max(len, subs.length());
}
}
return len;
}
大神的解法:
public int lengthOfLongestSubstring(String s) {
if (s.length()==0) return 0;
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
int max = 0;
int left = 0;
for(int i = 0; i < s.length(); i ++){
if(map.containsKey(s.charAt(i))){
left = Math.max(left,map.get(s.charAt(i)) + 1);
}
map.put(s.charAt(i),i);
max = Math.max(max,i-left+1);
}
return max;
}
x,i-left+1);
}
return max;
}
``
用map 确实比较好