先说结论:自己没做出来,抄的别人的。
https://www.cnblogs.com/ariel-dreamland/p/8668286.html
给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
给定 "abcabcbb"
,没有重复字符的最长子串是 "abc"
,那么长度就是3。
给定 "bbbbb"
,最长的子串就是 "b"
,长度是1。
给定 "pwwkew"
,最长子串是 "wke"
,长度是3。请注意答案必须是一个子串,"pwke"
是 子序列 而不是子串。
思路:
循环字符串,找下一个相同的字符,计算间隔。写了半天发现是错的。。。凉凉因为aab都过不了。。。
暴力搜索:
循环所有字符串,两个循环,然后还要再判断这个里面重复不。用set来做。最后超时了。凉凉。。。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
set<char> myset;
int res=0;
for(int i=0;i<s.size()-1;i++)
for(int j=0;j<s.size();j++){
string s1(s,i,j-i);
for(int k=0;k<s1.size();k++){
if(!myset.insert(s1[k]).second)
break;
}
if(res<myset.size())
res=myset.size();
myset.clear();
s1.clear();
}
return res;
}
};
优化了一下,让i从0到n-1;j从n开始往前走j--,如果发现不重复的子串,就没有必要再往前走了。但是还是超时了。。。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
set<char> myset;
int res=0;
int flag=0;
int success=0;
for(int i=0;i<s.size()-1;i++){
success=0;
for(int j=s.size();j>i;j--){
string s1(s,i,j-i);
for(int k=0;k<s1.size();k++){
if(!myset.insert(s1[k]).second)
{
flag=1;//insert fail -- substring has same character
break;
}
}
if(!flag){//insert success for substring whose characters are all different
if(res<myset.size())
res=myset.size();
success=1;//no need to decrease j
flag=0;
myset.clear();
s1.clear();
break;
}
flag=success=0;
myset.clear();
s1.clear();
}
}
return res;
}
};
又不甘心,再优化,感觉myset插入的时候太耗时间,改为手动排序子字符串,结果还是超时啊。。。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
// set<char> myset;
int res=0;
int flag=0;
int success=0;
for(int i=0;i<s.size()-1;i++){
success=0;
for(int j=s.size();j>i;j--){
string s1(s,i,j-i);
sort(s1.begin(),s1.end());
for(int k=0;k<s1.size()-1;k++){
if(s1[k]==s1[k+1])
flag=1;
}
if(!flag){//insert success for substring whose characters are all different
if(res<s1.size())
res=s1.size();
success=1;//no need to decrease j
flag=0;
// myset.clear();
s1.clear();
break;
}
flag=success=0;
//myset.clear();
s1.clear();
}
}
return res;
}
};
心态崩了。。。去看看人家的吧。
这个博客讲的太好: