Longest Substring Without Repeating Characters
题目描述:
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 subsequenceand not a substring.
题目大意:
给定一个字符串,最长连续没有重复字符的子串。
最直接的想法:
可以枚举每一种情况,
从第一个元素开始,往后遍历,如果有出现重复元素就停止,记录长度。
然后从第二个元素开始,往后遍历,如果有重复元素就停止,记录长度。
以此类推...我们从记录的最长的长度中选取最长的即是答案。
但其实我们并不需要枚举每一种情况,假设我们从第i个元素开始,往后遍历,到第j个元素,是重复元素,那么,与j相同的元素在i个j之间,包括i,假设这个元素是i+p,那么i到i+p之间的元素是不需要遍历的,得到的长度总是比从i开始遍历短。我们只需要从i+p+1开始就可以保证不会丢失最优解。
需要注意的是:
在出现重复元素,进行下一次遍历的时候,要将即将遍历元素位置之前的标记都清除。
还有一种特殊情况,即整个字符串没有出现重复元素,按照之前的程序算法,这种情况是会丢失的,要做特殊处理。
题目代码:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int i=0, j=0, ans=0;
int book[256] = {0};
while(j < s.length()){
if(book[s[j]] == 1){
ans = max(ans, j-i);
while(s[i] != s[j]){
book[s[i]] = 0;
i++;
}
i+=1;
}else{
book[s[j]] = 1;
}
j++;
}
return max(ans, j-i);
}
};