leetcode 3 Longest Substring Without Repeating Characters

题目

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;
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。