题目来自leetcode.
输入:一个字符串
输出:最长不重复字串长度
例:
输入:abbbbca
输出:3
基本思路:按顺序遍历s,并统计每一个字符s[i]是否出现过,并统计上次出现的位置pos[i]。定义len[i]为下标i结尾的子串的最大长度,则
1)若s[i]未出现过, len[i] = len[i - 1]+1
2)若s[i]出现过,len[i]=min(len[i-1] + 1, i - pos[i]);
max(len[0..i]) 即为所求
复杂度:O(n)
代码:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
map<char, int> counter;
map<char, int> pos;
int i;
int len = 0;
int max_len = 0;
if(s.size() == 0) {
return 0;
}
for(i = 0; i < s.size(); i++) {
counter[s[i]] ++;
if(counter[s[i]] == 1) {
len ++;
pos[s[i]] = i;
}
else {
len = min(i - pos[s[i]], len + 1);
pos[s[i]] = i;
}
if(max_len < len)
max_len = len;
}
return max_len;
}
};