leetcode-3- 无重复字符的最长子串

题目

无重复字符的最长子串

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke", 是一个子序列,不是子串。

解答

使用滑动窗口:

class Solution {
    public int lengthOfLongestSubstring(String s) {
        if(s==null||s.length()==0){
            return 0;
        }
        HashMap<Character,Integer> index=new HashMap<>();
        int lo=0,hi=0;
        int max=1;
        int len=s.length();
        index.put(s.charAt(lo),lo);
        while(++hi<len){
            int i=index.getOrDefault(s.charAt(hi),-1);
            if(i==-1||i<lo){
                // 说明当前窗口里没有s[hi]这个字符:可能是hi之前都没有,也可能是有,但是在lo之前
                index.put(s.charAt(hi),hi);
            }else{
                // 说明当前窗口内已经有了s[hi],需要移(滑)动窗口
                // 窗口长度本来是hi-lo+1,但是因为已经有一个重复的,所以要减一 
                max=Integer.max(max,hi-i);
                // 修改lo,进行滑动
                lo=i+1;
            }
            max=Integer.max(max,hi-lo+1);
            // 更新index(保存的始终是滑动窗口之内的)
            index.put(s.charAt(hi),hi);
        }
      
        return max;
    }
}

猜你喜欢

转载自blog.csdn.net/RedemptionC/article/details/107620586