美文网首页
leetcode 3 Longest Substring Wit

leetcode 3 Longest Substring Wit

作者: 叫我坤坤 | 来源:发表于2020-06-01 10:09 被阅读0次

题目

https://leetcode.com/problems/longest-substring-without-repeating-characters/

枚举所有子串进行重复判断,应该会超时。考虑更优化的方式

思路一

将问题转化为:遍历整个字符串的单个字符,计算以当前字符结尾的不重复子串长度,取最大值。注意这里的串必须以当前的单个字符结尾。这样问题就很好解决了:用当前字符的下标减去最早没有出现过重复字符的位置即可。
最早没出现过重复字符的位置怎么计算?如果所有的字符都只出现了一次,那么这个值是0,如果某个字符出现多次,那位置就是重复字符倒数第二次出现的下一个位置,注意这里要对所有重复字符取最大值。
具体解法:
遍历字符串,用map维护字符最后一次出现的下标,用变量left记录最终没出现过重复字符的位置。对于当前的字符,如果在之前出现过位置为i,更新left=max(i,left),然后最长的字符串长度为当前坐标减left

代码

    public static int lengthOfLongestSubstring(String s) {
        if (s == null || "".equals(s)) {
            return 0;
        }
        Map<Character, Integer> indexMap = new HashMap<>();

        int maxLen = 0;
        int left = 0;
        for (int i = 0; i < s.length(); i ++) {
            char c = s.charAt(i);
            if (indexMap.get(c) != null) {
               left = indexMap.get(c) > left ? indexMap.get(c) : left;
            }

            maxLen = i - left + 1 > maxLen ? i - left + 1 : maxLen;
            indexMap.put(c, i + 1);
        }

        return maxLen;
    }

相关文章

网友评论

      本文标题:leetcode 3 Longest Substring Wit

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