算法题:最长无重复字母子字符串 滑动窗口做法

  • 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
  • 示例 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;
    }

在这里插入图片描述

posted @ 2021-04-02 17:29  HumorChen99  阅读(0)  评论(0编辑  收藏  举报  来源