美文网首页
Leetcode3. 无重复字符的最长子串

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

作者: LonnieQ | 来源:发表于2019-11-14 21:15 被阅读0次

    题目

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

    示例 1:

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

    示例 2:

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

    示例 3:

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

    思路

    使用map记录每一个字符上次出现的位置,当遇到同一个字符的时候,移除map中这个字符上一次出现的位置之前的元素。

    C++代码

    #include <iostream>
    #include <vector>
    #include <map>
    #include <queue>
    #include <set>
    using namespace std;
    class Solution {
    public:
        int lengthOfLongestSubstring(string s) {
            map<char, int> values;
            int max_size = 0;
            int last_erase_index = 0;
            for (int i = 0; i < s.size(); ++i) {
                char c = s[i];
                if (values.count(c) > 0) {
                    max_size = max(max_size, (int)values.size());
                    int lastIndex = values[c];
                    for (int j = last_erase_index; j <= lastIndex; ++j) {
                        values.erase(s[j]);
                    }
                    last_erase_index = lastIndex + 1;
                }
                values[c] = i;
            }
            max_size = max(max_size, (int)values.size());
            return max_size;
        }
    };
    int main(int argc, const char * argv[]) {
        cout << Solution().lengthOfLongestSubstring("abcabcbb") << endl;
        cout << Solution().lengthOfLongestSubstring("bbbbb") << endl;
        cout << Solution().lengthOfLongestSubstring("pwwkew") << endl;
        cout << Solution().lengthOfLongestSubstring("bpfbhmipx") << endl;
        return 0;
    }
    

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters

    相关文章

      网友评论

          本文标题:Leetcode3. 无重复字符的最长子串

          本文链接:https://www.haomeiwen.com/subject/prsdictx.html