zoukankan      html  css  js  c++  java
  • 3. Longest Substring Without Repeating Characters

    问题描述:

    Given a string, find the length of the longest substringwithout repeating characters.

    Example 1:

    Input: "abcabcbb"
    Output: 3 
    Explanation: The answer is "abc", with the length of 3. 
    

    Example 2:

    Input: "bbbbb"
    Output: 1
    Explanation: The answer is "b", with the length of 1.
    

    Example 3:

    Input: "pwwkew"
    Output: 3
    Explanation: The answer is "wke", with the length of 3. 
                 Note that the answer must be a substring, "pwke" is a subsequence and not a substring.

    解题思路:

    这道题我首先想到的是使用set来确保char唯一,使用queue来进行字符串的遍历。

    当遇见未出现的字符时加入set和queue。

    若遇见出现的字符则弹出队首元素并且删除set中的元素直至不出现重复。

    时间复杂度为O(n): 数组中的每个元素只进入set和queue一次(如果考虑到set和queue的增删操作可能还要乘个啥)。

    空间复杂度为O(n)

    看了一下最优解,发现别人充分利用字符可以被穷举这一特性进行解答,可以达到时间复杂度O(n), 空间复杂度O(1)。

    代码:

    我的方法:

    class Solution {
    public:
        int lengthOfLongestSubstring(string s) {
            //store current unrepeated char
            queue<char> char_q;
            //store current chars
            set<char> char_set;
            int ret = 0;
            for(char c : s){
                if(char_set.count(c) != 0){
                    ret = max((int)char_q.size(), ret);
                    while(char_q.front() != c){
                        char_set.erase(char_q.front());
                        char_q.pop();
                    }
                    char_set.erase(char_q.front());
                    char_q.pop();
                }
                char_q.push(c);
                char_set.insert(c);
            }
            ret = max((int)char_q.size(), ret);
            return ret;
        }
    };

    最优解法:

    class Solution {
    public:
        int lengthOfLongestSubstring(string s) {
            vector<int> dict(256, -1);
            int maxLen = 0, start = -1;
            for (int i = 0; i != s.length(); i++) {
                if (dict[s[i]] > start)
                    start = dict[s[i]];
                dict[s[i]] = i;
                maxLen = max(maxLen, i - start);
            }
            return maxLen;
        }
    };
  • 相关阅读:
    关于天气插件代码
    新的起点了
    如何实现按下回车键实现搜索

    random模块
    循环导入问题
    模块的搜索路径
    import 和from…import
    模块四种形式
    面向过程编程
  • 原文地址:https://www.cnblogs.com/yaoyudadudu/p/11231144.html
Copyright © 2011-2022 走看看