leetcode: 3.无重复字符的最长子串(滑动窗口)

链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
这道题的基本思想是滑动窗口,每当我们读入一个字符,将它放在一个set或者map中,如果此时所有字符均无重复,直接更新最大值,如果有重复,我们维护一个变量存储所有重复字符中最大的下标,(可能)更新最大值。
关于滑动窗口:滑动窗口是数组/字符串问题中常用的抽象概念。 窗口通常是在数组/字符串中由开始和结束索引定义的一系列元素的集合,即 [i, j)[i,j)(左闭,右开)。而滑动窗口是可以将两个边界向某一方向“滑动”的窗口。例如,我们将 [i, j)[i,j) 向右滑动 11 个元素,则它将变为 [i+1, j+1)[i+1,j+1)(左闭,右开)。
C++:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int n = s.size(), ans = 0;
        map<char, int>m; // 对于每个字符,最后出现的下标
        for (int j = 0, i = 0; j < n; j++) {
            if (m.find(s[j])!=m.end()) {
                i = max(m[s[j]], i);// i为当前重复的字符中下标最大值
            }
            ans = max(ans, j - i + 1);
            m[s[j]] = j+1;;
        }
        return ans;
    }
};

java:

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int n = s.length(), ans = 0;
        Map<Character, Integer> map = new HashMap<>(); // current index of character
        // try to extend the range [i, j]
        for (int j = 0, i = 0; j < n; j++) {
            if (map.containsKey(s.charAt(j))) {
                i = Math.max(map.get(s.charAt(j)), i);
            }
            ans = Math.max(ans, j - i + 1);
            map.put(s.charAt(j), j + 1);
        }
        return ans;

    }
}

python3:

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        dic = {} #一个空字典
        i,ans = 0,0
        for j in range (len(s)):
            if s[j] in dic:
                i = max(dic[s[j]],i)
            ans = max(ans,j-i+1);
            dic[s[j]] = j+1
        return ans;

你可能感兴趣的:(leetcode)