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

Java解法

这个题之前刷过一次,但面试的时候问到又懵逼了,就很气,当时想到了滑动窗口,但具体怎么滑却没有记得,关键点还是利用hashmap快速定位到重复字符串的下标,然后进行计算之间字符串的长度。

这个里面还有个坑点,就是正常情况下,i代表起点位置或重复字符的位置,如果i是j扩展过程中遇到的重复字符串位置,计算长度的时候应该是j - i,不用再加1(因为两者相同),如果i是计算的一次起点,就应该是j - i + 1(算上起点字符)。为了解决这个问题,map中记录的是字符的下一个位置,这样i代表重复字符的位置时,实际上是下一个位置,这样也可以用j - i + 1了。

class Solution {

    public int lengthOfLongestSubstring(String s) {

        Map<Character, Integer> map = new HashMap<>();

        int n = s.length(), ans = 0;

        for (int i = 0, j = 0; j < n; j++) {

            if (map.containsKey(s.charAt(j))) {

                i = Math.max(i, map.get(s.charAt(j)));

            }

            ans = Math.max(ans, j - i + 1);

            map.put(s.charAt(j), j + 1);

        }

        return ans;

    }

}

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

推荐阅读更多精彩内容