题目:
给一个字符串,找到最长的子串,子串不包括重复字符,例如:"abcabcbb"的最长子串就是"abc",长度为3."bbbbb"的最长子串是"b",长度为1
分析:
用哈希的方法,从前往后扫描一遍,最长子串中的字符不能重复,所以扫描时遇到的字符如果在之前出现过,那么说明此时之前扫描过的字符串有可能是最长的子串。又因为子串不能重复,所以找到之前扫描过的字符串中与当前相等的字符。把字符串中与当前相等字符的前面的一些字符清楚掉。然后两下标同时往前走一步,继续寻找有可能的最长子串
代码:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_map<char, int> u_map;
int n = s.length();
int i = 0, j = 0;
int maxLen = 0;
while(i < n){
if(u_map.count(s[i])){
maxLen = max(maxLen, i - j);
while(s[i] != s[j]){
u_map.erase(s[j]);
++j;
}
++i;
++j;
}else{
u_map[s[i]] = i;
++i;
}
}
maxLen = max(maxLen, n-j);
return maxLen;
}
};
更简单有效的代码:
int lengthOfLongestSubstring(string s) {
int n = s.length();
int i = 0, j = 0;
int maxLen = 0;
bool exist[256] = { false };
while (j < n) {
if (exist[s[j]]) {
maxLen = max(maxLen, j-i);
while (s[i] != s[j]) {
exist[s[i]] = false;
i++;
}
i++;
j++;
} else {
exist[s[j]] = true;
j++;
}
}
maxLen = max(maxLen, n-i);
return maxLen;
}