题目很简单,假如输入“abcdbf”,那么最长不含重复字符的字串就为“cdbf”,长度就是4.这里没有要求输出子串,想要输出稍微加点东西就行了。从网上看了很多个版本,一般用的是动态规划。但是这个算法不需要用到动态规划。从网上搜到一个很好的代码,共享之。这个算法很容易理解。
首先定义一个hash表,也就是times这个表。记录每个字符是否出现过,要是没有出现就是0,出现了就把它置为1.要是没有遇到重复的,就把end指针一直后移,同时最大的长度也要增加。要是遇到重复的了。假如abcdb,这时候遇到第二个b了,我就从头开始,一直找到第一个b,把这之间的次数都重新置为0.这样b被置为0后,第一个if语句才能得以继续执行。不知道我这样解释清楚了没有,实在佩服作者这种简洁直观的代码。
#include <iostream>
using namespace std;
#define CHAR_SET_SIZE 256
int GetMaxUSubStrLen(char *s)
{
int maxLen = 0;
int times[CHAR_SET_SIZE] = {0};
char *pStart, *pEnd;
pStart = pEnd = s;
while (*pEnd != '\0')
{
int idx = (*pEnd);
if (times[idx] == 0)
{
++pEnd;
times[idx] = 1;
if (pEnd - pStart > maxLen)
maxLen = pEnd - pStart;
}
else
{
int idx_s = (*pStart);
times[idx_s] = 0;
++pStart;
}
}
return maxLen;
}
int main()
{
char a[]= "abcbef";
cout<<GetMaxUSubStrLen(a)<<endl;
return 0;
}