题意:
找出S中没有重复字符的子串。
思路:
用队列维护没有重复字符的子串,每次队列中进入一个元素,判断是否有队中重复元素,如果有,就从队首一直做出队操作,知道刚刚重复的那个字符出队。
时间复杂度O(n),空间复杂度O(m)即字符集大小。
官方题解中用了map或者set的方法我是不认的,毕竟时间复杂度O(nlogn),用hashmap和hashset这种事不好说。
但是官方题解的最后一个代码是不错的,复杂度与我相同,但常数应该比我小。
代码:
//
// Created by house on 1/9/17.
//
class Solution {
public:
int lengthOfLongestSubstring(string s) {
queue<char> qu;
bool pos[256];
memset(pos, false, sizeof(pos));
int ans = 0;
for (int i = 0; i < s.size(); ++i) {
if (pos[s[i]]) {
while (qu.front() != s[i]) {
pos[qu.front()] = false;
qu.pop();
}
qu.pop();
}
qu.push(s[i]);
pos[s[i]] = true;
if (qu.size() > ans) {
ans = qu.size();
}
}
return ans;
}
};