附上后两种方法的参考链接
3. Longest Substring Without Repeating Characters
Medium
Given a string, find the length of the longest substring without repeating characters.
Example 1:
Input: "abcabcbb"
Output: 3
Explanation: The answer is "abc"
, with the length of 3.
Example 2:
Input: "bbbbb"
Output: 1
Explanation: The answer is "b"
, with the length of 1.
Example 3:
Input: "pwwkew" Output: 3 Explanation: The answer is"wke"
, with the length of 3. Note that the answer must be a substring,"pwke"
is a subsequence and not a substring.
Accepted
1,143,449
Submissions
3,944,388
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int n=s.length();
string max="";
string tmp="";
string tmp1="";
string m=s;
for(int k=0;k<n;k++){//暴力查找,后面想到好方法再更新
s=m.substr(k);
//cout<<s<<endl;
for(int i=0;i<s.length();i++){
int flag=0;
for(int j=0;j<tmp.length();j++){
if(tmp[j]==s[i]){flag=1;break;}
}
if(flag==0)
{
tmp1+=s[i];
tmp=tmp1;
}else{
tmp=tmp1="";
break;
}
if(max.length()<tmp1.length()){
max=tmp1;
}
}
}
//cout<<max<<endl;
return max.length();
}
};
下面这个看了别人的题解用的是一个isunique函数,但是貌似超时了?
class Solution {
public:
bool isunique(string s,int start,int end){
set<char> st;
for(int i=start;i<end;i++){
if(st.find(s[i])!=st.end()) return false;
st.insert(s[i]);
}
return true;
}
int lengthOfLongestSubstring(string s) {
int MAX=0;
for(int i=0;i<s.length();i++){
for(int j=i+1;j<=s.length();j++){
if(isunique(s,i,j)){
MAX=max(MAX,j-i);
}
}
}
return MAX;
}
};
下面这个用的是滑动窗口:(好像也没有比第一个暴力快多少,时间复杂度应该是O(N^2))
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int n=s.length();
set<char> st;
int i=0,j=0,ans=0;
while(i<n&&j<n){
if(st.find(s[j])==st.end()){//无重复则尾巴右移
st.insert(s[j]);j++;
ans=max(ans,j-i);
}else{//有重复则头右移
st.erase(s[i]);
i++;
}
}
return ans;
}
};