Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.
(1)26个flag记录字母在字符串中出现的位置
const int CHARSIZE = 26;
int CharMap[CHARSIZE] = {-1}; // flag
void Reset(char *a)
{
for(int i = 0; i < CHARSIZE; i++)
a[i] = 0;
}
int lengthOfLongestSubstring(string s)
{
int MaxLen = 0, tmpLen = 0, start = 0;
for(int i = 0; i < s.length(); i++)
{
if(CharMap[s[i]-'a'] == -1)
{
CharMap[s[i]-'a'] = i;
}
else
{
tmpLen = (i-1)-start+1;
if(tmpLen > MaxLen)
MaxLen = tmpLen;
for(int j = start; j < CharMap[s[i]-'a']; j++)
CharMap[s[j]-'a'] = -1;
start = CharMap[s[i]-'a']+1;
CharMap[s[i]-'a'] = i;
}
}
return MaxLen;
}
void test_lengthOfLongestSubstring()
{
memset(CharMap, -1, CHARSIZE * sizeof(int));
string s1 = "abcdcefghabd";
string s2 = "bbbbb";
string s3 = "abcabcbb";
cout << lengthOfLongestSubstring(s3) << endl;
}
(2)优化:26个flag仍记录位置,但是每次发现重复后不需要置成-1,每次都算一个maxlen