![be6f0af9f11a630cec2e580c5145350a.png](https://i-blog.csdnimg.cn/blog_migrate/a8153830030d3d062a5436e51ce0313a.jpeg)
// 面试题48:最长不含重复字符的子字符串
// 题目:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子
// 字符串的长度。假设字符串中只包含从'a'到'z'的字符。
#include <vector>
#include <string>
#include <iostream>
using namespace std;
int maxlengstring(const string& str)
{
if(str.empty())
return 0;
//定义一个值都为-1的pos[]的26个数
std::vector<int>position(26,-1);
int maxlen=0;
int curlen=0;
for(size_t i=0;i<str.size();i++)
{
int pos=str[i]-'a';//abcdarca
//第i位上的字母在左侧从未出现 f(i)=f(i-1)+1
if(position[pos]<0)
curlen+=1;
else
{
int d=i-position[pos];
// d<=f(i-1)时 f(i)=d此时上一次出现的位置在上一个最长不重复子串内部
if(curlen>=d)
curlen=d;
//d>f(i-1) 时 f(i)=f(i-1)+1
else
{
curlen+=1;
}
}
position[pos]=i;
maxlen=maxlen>curlen?maxlen:curlen;
}
return maxlen;
}
int main()
{
string str="abcdadrcadfa";
int len=maxlengstring(str);
cout<<"len: "<<len;
}