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

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
  请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

我们先用一个例子来想一想如何在较优的时间复杂度内通过本题。

我们不妨以示例一中的字符串 exttt{abcabcbb}abcabcbb 为例,找出 从每一个字符开始的,不包含重复字符的最长子串,那么其中最长的那个字符串即为答案。对于示例一中的字符串,我们列举出这些结果,其中括号中表示选中的字符以及最长的字符串:

以 exttt{(a)bcabcbb}(a)bcabcbb 开始的最长字符串为 exttt{(abc)abcbb}(abc)abcbb;
以 exttt{a(b)cabcbb}a(b)cabcbb 开始的最长字符串为 exttt{a(bca)bcbb}a(bca)bcbb;
以 exttt{ab(c)abcbb}ab(c)abcbb 开始的最长字符串为 exttt{ab(cab)cbb}ab(cab)cbb;
以 exttt{abc(a)bcbb}abc(a)bcbb 开始的最长字符串为 exttt{abc(abc)bb}abc(abc)bb;
以 exttt{abca(b)cbb}abca(b)cbb 开始的最长字符串为 exttt{abca(bc)bb}abca(bc)bb;
以 exttt{abcab(c)bb}abcab(c)bb 开始的最长字符串为 exttt{abcab(cb)b}abcab(cb)b;
以 exttt{abcabc(b)b}abcabc(b)b 开始的最长字符串为 exttt{abcabc(b)b}abcabc(b)b;
以 exttt{abcabcb(b)}abcabcb(b) 开始的最长字符串为 exttt{abcabcb(b)}abcabcb(b)。

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/wu-zhong-fu-zi-fu-de-zui-chang-zi-chuan-by-leetc-2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        unordered_set <char> st;
        int n = s.size();

        int ans = 0;
        int r = -1;
        for (int l = 0; l < n; l++) {
            if (l != 0) {
                st.erase(s[l - 1]);
            }
            while (r + 1 < n && !st.count(s[r + 1])) {
                st.insert(s[r + 1]);
                r++;
            }
            ans = max(ans, r - l + 1);
        }

        return ans;
    }
};
原文地址:https://www.cnblogs.com/xgbt/p/13701351.html