题目要求:
abcdefb就输出abcdef
abcbef就输出cbef
就说可以用hash实现,复杂度是O(n)
请给我点思路,我要的不是代码,谢谢
-----------------------------
思路:
直观地得到一个思路,表达起来真够难的,直接写代码要更容易
以abcbef这个串为例
用一个数据结构pos记录每个元素曾出现的下标,初始为-1
从s[0]开始,pos['a'] == -1,说明a还未出现过,令pos['a'] = 0,视为将a"加入当前串",同时长度++
同理令pos['b'] = 1,pos['c'] = 2
到s[3]时,pos['b'] != -1,说明'b'在前面已经出现过了,此时可得到一个不重复串"abc",刷新当前的最大长度,然后做如下处理:
pos[s[0~2]] = -1,亦即将"ab""移出当前串",同时当前长度减去3
重复以上过程
-------------------------------
一个初步的算法实现:
#include
using namespace std;
int main()
{
char *str="abcbef";
int nLengths(0), nTmpLength(0), i(0);
int a[256];
int span; //第一次重复的时候,与最早出现的字符像隔得字符个数
for ( i; i < 256; ++i )
{
a[i] = 0;
}
for ( i = 0; i < 6; ++i )
{
int k = (int)(szAry[i]);
if ( a[k] == 0 )
{
nTmpLength += 1;
a[k] = nTmpLength;
if ( nTmpLength > nLengths )
{
nLengths = nTmpLength;
}
}
else
{
span=i-(a[k]-1);
a[k] = nTmpLength;
nTmpLength = span;
}
}
printf( "nLengths: %d\n", nLengths );
return 1;
}
后续问题:
这道题没有解决,但大体的思路有了,只对hash的应用,没有输出最大不重复字符串的部分。待续
转自:
阅读(1199) | 评论(0) | 转发(0) |