// 面试题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)+1if(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)+1else{curlen+=1;}}position[pos]=i;maxlen=maxlen>curlen?maxlen:curlen; }return maxlen;
}int main()
{string str="abcdadrcadfa";int len=maxlengstring(str);cout<<"len: "<<len;
}