这是一个在字符串中找字串的问题,一开始想到用直观的方法做,开辟一个最大子串(A)和子串(B),然后用while循环遍历,从第一个字符开始,符合条件就放入B中,中断了就和A比较,较大的串放入A中,清空B,再重新开始找新的B,中断后的重新遍历的起始点是需要考虑一下的。如下图所示,第一次遍历在第二个“c”处中断,则第二次遍历不应从第二个“c”开始!而是从第一个“c”的后面一个字符开始,也就是“d”,这也是我在一开始犯的错误。。。还有一个注意点是,当没用中断时,循环退出,需要再次比较串A和串B。提交之后发现计算复杂度不符合要求。
在修的帮助下,放弃上述做法,改用哈希表做。即不需要单独string来存最大字串,只要记住最大字串的索引和长度就行啦。通过两层for循环实现,出现某一字符就用把哈希表相应位置置为1,出现重复字符就重置哈希表,改变起始点再次遍历。
#include<iostream>
#include<string>
#include<vector>
#include<string.h>
using namespace std;
int maxLen( string s )
{
int hash[256] = {0} ;
int max_len = 0;
int current_len = 1;
int len = s.length();
for( int i=0; i<len; )
{
int tag = 0;
memset( hash, -1, sizeof(hash) );
hash[ s[i] ] = i;
current_len = 1;
for( int j=i+1; j<len; j++ )
{
if( hash[ s[j] ] == -1 )
{
hash[ s[j] ] = j;
current_len++;
}
else
{
i = hash[ s[j]] + 1;
tag = 1;
break;
}
}
if( current_len > max_len )
{
max_len = current_len;
}
if( tag == 0 ) break;
}
}
int main()
{
string str;
vector<int> result;
while( cin >> str )
{
int temp = maxLen( str );
cout << temp << endl;
result.push_back( temp );
}
return 0;
}
原题目链接:点击打开链接