算法题:最长无重复字母子字符串 滑动窗口做法
- 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
- 示例 1:
- 输入: s = “abcabcbb”
- 输出: 3
- 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
- 示例 2:
- 输入: s = “bbbbb”
- 输出: 1
- 解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
- 示例 3:
- 输入: s = “pwwkew”
- 输出: 3
- 解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
-
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
- 示例 4:
- 输入: s = “”
- 输出: 0
- 提示:
- 0 <= s.length <= 5 * 104
- s 由英文字母、数字、符号和空格组成
- 来源:力扣(LeetCode)
- 链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
- 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法:
abcdbef
start左标兵,right右标兵,max记录下的最大长度,now现有的串的长度,最后是现有的串
a start=0 right=0 max=1 now=1 a
b start=0 right=1 max=2 now=2 ab
c start=0 right=2 max=3 now=3 abc
d start=0 right=3 max=4 now=4 abcd
b start=2 right=4 max=4 now=3 cdb
e start=2 right=5 max=4 now=4 cdbe
f start=2 right=6 max=5 now=5 cdbef
假设有个窗口,里面的字母是没有重复的,从第一个字母开始,放入窗口,然后让left=0,right向右移动,不断往右边,让右边的字母进入滑动窗口,每次进入一个则和最大不重复子串长度比较是否超出了最大值,超出了就更新最大值,没有就继续。一旦往右边遇到了一样的单词我们就让start移动到这个单词上次出现的位置的下一个位置(start只增大不减小,因此如果新的比旧的start小就不换start),然后继续往右移动直到所有的单词都没有了。而每次移动的时候判断最大长度是,当前位置的下标减去最左侧start的下标然后加一。
时空复杂度
时间:O(n)
空间:O(1)
代码:
public int lengthOfLongestSubstring2(String s) {
int len=s.length();
if (len==0){
return 0;
}
int res=0;
Map<Character,Integer> map=new HashMap<>();
int start=0;
for (int i=0;i<len;i++){
Character c=s.charAt(i);
if (map.containsKey(c)){
start=Math.max(start,map.get(c)+1);
}
res=Math.max(res,i-start+1);
map.put(c,i);
}
return res;
}
本文来自博客园,作者:HumorChen99,转载请注明原文链接:https://www.cnblogs.com/HumorChen/p/18039644