给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
给定 "abcabcbb"
,没有重复字符的最长子串是 "abc"
,那么长度就是3。
给定 "bbbbb"
,最长的子串就是 "b"
,长度是1。
给定 "pwwkew"
,最长子串是 "wke"
,长度是3。请注意答案必须是一个子串,"pwke"
是 子序列 而不是子串。
从第二个字符开始判断,如果s[i]之前的元素有和s[i]相等的,那么就将当前的长度i-temp压入vector容器,此时要给temp变为j+1,因为此刻当前的字串最大了,不可能再增大;否则就将当前的长度压入。最后再这个容器里面找最大值就行了。
#include<iostream>
#include<vector>
using namespace std;
//求的是子串而不是子序列
class Solution
{
public:
int LengthOfLongestSubstring(string s){
int length=s.length();
int temp=0;
vector<int> p;
//=length是因为看的是之前的元素,不包括它本身
for(int i=0;i<=length;i++){
for(int j=temp;j<i;j++){
if(s[i]==s[j]){
//选择出来的字符串的长度
p.push_back(i-temp);
//以temp开始到p[i]找到与p[i]相同的字符的时候记录的下次开始遍历的下标,就是与p[i]相同的值的下一个元素
temp=j+1;
}
else
{
p.push_back(i-temp);
}
}
}
int max=0;
for(int i=0;i<p.size();i++){
if(p[i]>max)
max=p[i];
}
return max;
}
};
int main(){
Solution solution;
int n,m;
string p="pwwkew";
//vector<string> s;
//for(int i=0;i<n;i++){
// cin>>p[i];
// //s.push_back(p);
//}
std::cout<<solution.LengthOfLongestSubstring(p)<<endl;
system("pause");
}