美文网首页
【D16】无重复字符的最长子串(LC 3)

【D16】无重复字符的最长子串(LC 3)

作者: sirenyunpan | 来源:发表于2021-02-23 00:06 被阅读0次

    3. 无重复字符的最长子串

    问题描述

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

    解题思路

    读题之后想用动态规划来解决,但是看到s.length <= 5 * 10^4时,经验告诉我,动态规划很可能超出时间/空间限制。
    于是开始思考用双指针来解题。固定左指针,移动右指针;当右指针移动时,遇到了重复的字符,则将左指针向右移动至右侧重复字符的下一个字符,若重复字符在此时left的左侧,则左指针不移动;这样就保证了左右指针之间的字符一定是无重复字符。

    代码实现

    class Solution {
        public int lengthOfLongestSubstring(String s) {
            int n = s.length(), left = 0, res =0;
             //hashmap,key为字符,value为该字符在s中的索引值
            HashMap<Character, Integer> map = new HashMap<Character, Integer>();
    
            for(int i = 0; i < s.length(); i ++){
                Character c = s.charAt(i);
                //如果右指针移动时,遇到了重复的字符,则将左指针移动至重复字符的下一个字符
                if(map.containsKey(c)){
                    left = Math.max(left, map.get(c) + 1);
                }
                map.put(c,i);
                //不断更新无重复字符子串的最大值
                res = Math.max(res, i-left+1);
            }
            return res;
        }
    }
    

    相关文章

      网友评论

          本文标题:【D16】无重复字符的最长子串(LC 3)

          本文链接:https://www.haomeiwen.com/subject/wmrlfltx.html