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.
第一种方法:用 flags数组记录每个字符是否出现过,从第一个字符开始循环,用int second 记录搜索开始位置,看字符str[ i ] 是出现过,如果出现过则判断最大长度,同时要初始化lags数组的状态,初始化后并且从second 到 i 直接的状态也要重新设置,再进入轮循环。注意最后一次。
#include
#include
#include
using namespace std;
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int i=0;
int flags[1024]={0};//其实可能不全是0
memset(flags,0,sizeof(flags));
while(i
< (i-second) ) ? reserv="second" , : max; memset(flags,0,sizeof(flags)); second="s.find(s[i],second)+1;" int j="second;" while(j<="i)//初始化从second到现在的flags状态" flags[s[j]]="1;" j++; i++;>
max? reserv = second, (s.length()-second):max;//最后一次
return max;
}
int reserv,first,second,max;//second 搜索无重复字串的开始位置,reserv记录最大字串的开始位置
Solution():reserv(0),first(0),second(0),max(0){};
};
int main()
{
string str="cdd";
Solution s;
s.lengthOfLongestSubstring(str);
cout<
<<":"<
<
第二种方法:从左往右扫描,当遇到重复字母时,以上一个重复字母的index+1,作为新的搜索起始位置,直到最后一个字母,复杂度是O(n)
用flags记录每个元素最后出现的位置,用int second 记录搜索开始位置,如果遇到元素重复出现了且出现位置在大于等于second 就是真的重复,如果出现位置在second前面那就没有重复这次搜索的字串
转自:https://github.com/soulmachine/leetcode
![](https://img-blog.csdn.net/20150505213721161?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGUxMTkxMjY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
#include
#include
#include
using namespace std;
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int i=0;
int flags[256]={-1};//并没有把数组所有元素置为零!!!!
memset(flags,-1,sizeof(flags));
//cout<
<
= second ) //有等于!!,出现的位置在second前面没有问题,这次是从second开始的 { max = ( max < (i- second) ) ? reserv = second , (i- second) : max; second= flags[s[i]]+1; } flags[s[i]]=i;//记录最后一次的位置!!! i++; } max= (s.length()-second)>max? reserv = second, (s.length()-second):max;//最后一次 return max; } int reserv,first,second,max; Solution():reserv(0),first(0),second(0),max(0){}; }; int main() { string str="c"; Solution s; s.lengthOfLongestSubstring(str); cout<
<<":"<
<