地址:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
思路:可以直接暴力枚举子串左端点,也可以枚举子串右端点,在对左端点l进行处理,将l=max(l,a[s[r]]+1)即可。
Code:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<unordered_map>
#include<map>
using namespace std;
//class Solution { //枚举子串左端点
//public:
// int lengthOfLongestSubstring(string s) {
// int n=s.length(),res=0;
// int a[1000],x,p;
// memset(a,-1,sizeof(a));
// for(int i=0;i<n;++i)
// {
// p=0;
// for(int j=i;j<n;++j)
// {
// x=int(s[j]);
// if(a[x]>=i&&a[x]!=j){
// p=1;
// res=max(res,j-i);
// break;
// }else{
// a[x]=j;
// }
// }
// if(!p){
// res=max(res,n-i);
// break;
// }
// }
// return res;
// }
//};
//枚举右端点
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int n=s.length(),res=0;
int l=0,r=0;
int a[1000];
memset(a,-1,sizeof(a));
while(r<n){
l=max(l,a[int(s[r])]+1);
a[int(s[r])]=r;
res=max(res,r-l+1);
++r;
}
return res;
}
};
int main()
{
string str;
cin>>str;
Solution So;
cout<<So.lengthOfLongestSubstring(str)<<endl;
return 0;
}