问题描述:
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; } };