题意:给定一个字符串s,找出s中的一个最长子串t,在t中没有重复的字符。
思路:使用两个指针i和j,开始都指向第一个字符,向后移动j,直到发现j所指向的位置出现过一次。查看j - i的值是否是当前最大的,是的话更新保存的最大值。然后移动i,直到s[i] == s[j]停止,在移动过程中将i移动过程中记录的s[i]出现次数重置为0。然后重复j的移动,直到j大于字符串的长度。
代码实现
#include <cstring>
class Solution {
public:
int lengthOfLongestSubstring(string s) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int len = s.size(), i, j, ans;
bool mark[300];
memset(mark, false, sizeof(mark));
i = j = ans = 0;
while(j < len)
{
if(mark[s[j]])
{
if((j - i) > ans)
ans = j - i;
while(s[i] != s[j])
mark[s[i ++]] = false;
i ++;
j ++;
}
else
{
mark[s[j]] = true;
j ++;
}
}
ans = max(ans, len - i);
return ans;
}
};