给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
给定 “abcabcbb” ,没有重复字符的最长子串是 “abc” ,那么长度就是3。
给定 “bbbbb” ,最长的子串就是 “b” ,长度是1。
给定 “pwwkew” ,最长子串是 “wke” ,长度是3。请注意答案必须是一个子串,”pwke” 是 子序列 而不是子串。
#include<iostream>
#include<string>
#include<map>
#include<cmath>
using namespace std;
static int max(int a, int b)
{
return a > b ? a : b;
}
class sulotion
{
public:
int lenth(string s)
{
int n = s.length();
map<char, int> ma;
for (int i = 0; i < n; i++)
{
ma[s[i]] = -1;
}
int ret = 0, pre = -1;
for (int j = 0; j < n; j++)
{
pre = max(pre, ma[s[j]]);
ret = max(ret, j - pre);
ma[s[j]] = j;
}
return ret;
}
};
#if 0
-------流程:a b c a b c b b ==> s.length() = 8; ma.size() = 3 (a,b,c);
-------s=>ret = 0;pre = -1;
-------1. j = 0; ma[s[j]] = -1,pre = -1;ret = 1;ma[s[j]] = 0;ma[a]=0;
-------2. j = 1; ma[s[j]] = -1,pre = -1;ret = 2;ma[s[j]] = 1;ma[b]=1;
-------3. j = 2; ma[s[j]] = -1,pre = -1;ret = 3;ma[s[j]] = 2;ma[c]=2;
-------4. j = 3; ma[s[j]] = 0, pre = 0 ;ret = 4;ma[s[j]] = 0;ma[a]=0;
-------5. j = 4; ma[s[j]] = 1, pre = 1 ;ret = 4;ma[s[j]] = 1;ma[a]=1;
-------6. j = 5; ma[s[j]] = 2, pre = 2 ;ret = 4;ma[s[j]] = 2;ma[a]=2;
-------7. j = 6; ma[s[j]] = 1, pre = 2 ;ret = 4;ma[s[j]] = 1;ma[a]=1;
-------8. j = 7; ma[s[j]] = 1, pre = 2 ;ret = 4;ma[s[j]] = 1;ma[a]=1;
#endif
int main()
{
string s = "abcabcbb";
sulotion su;
cout << su.lenth(s) << endl;
return 0;
}