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 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;

    }

}

你可能感兴趣的:(leetcode 3 无重复字符的最长子串)