Given a string, find the length of the longest substring without repeating characters.
Examples:
Given "abcabcbb"
, the answer is "abc"
, which the length is 3.
Given "bbbbb"
, the answer is "b"
, with the length of 1.
Given "pwwkew"
, 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.
解析:我们可以用一个数组来存储每一个字符在字符串中的位置。数组的下标表示这个字符的ASCII码,元素表示其在字符串中的位置。
其实这是一个对于字符串问题的通用方法。
另外一个重要的逻辑就是当遇到和之前重复的字符(假设两次重复的字符的位置分别为first,end)时,即可能遇到了一个潜在的最大值;
然后将下一次扫描的起点设置为first+1即可。我们可以用下面一张图来加深理解。
1. 假设定义存放字符串中的字符位置数组为 countTable[256],刚开始初始化为-1;countTable['q']=0,表示q的位置为0,;
2. 定义两个指针start=0,end=1,一个指向子串的起始位置,一个指向子串的结束位置,循环结束的条件是end<length;
3.start不动时,end往后移,直到出现了一个重复的字符时,就表示start~end这个区间就是潜在的最长非重复字符串之一。
4.下一次start移动的地方就是first+1,直到end==length。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.length()<=0) return 0;
int countTable[256];
memset(countTable,-1,sizeof(countTable));
countTable[s[0]] = 0;
int maxn = 1;
int start = 0;
int end = 1;
while (end < s.length()){
if (countTable[s[end]] >= start)
{
start = countTable[s[end]] + 1;
}
maxn = maxn>(end-start+1)?maxn:(end-start+1);
countTable[s[end]] = end;
end++;
}
return maxn;
}
};