//目的描述: 为了查找指定字符串中最长的重复字符串(允许字符重复),并求出最多个数
//算法描述:需要的是重复字符串,重复字符串的长度最大可能是全字符串长度减去1,这样我们从
//可能最大的开始,依次减少,到字符串里面找出所有长度为指定最大的重复字符串并计数.
//在遍历字符串的过程中,我们把字符串分成两个部分遍历,一个是从0 到当前位置,一个是从
//当前位置加1到字符串末尾,只要找到,这些就肯定是最长的
int MaxLengthRepeatString(const char *src)
{
assert(src);
int length = strlen(src);
int len = length - 1 ;
int count = 0;
char * target = 0;
for(;len > 0;len--)
{
//向前推进,遍历全字符串
for(int i = 0;i + len <= length;++i)
{
//在当前位置的前面一串字符串(包括当前字符)中遍历
int k = 0;
for(k = 0;k + len <= i;k++)
{
int j = 0;
bool find = true;
//和前面字符串对比从当前字符串起,长度为最长的所有连续可能字符
for(j = 0;j < len ;++j)
{
if(src[i + j] != src[k + j])
{
find = false;
break;
}
}
if(find)
{
//找到一个,输出并计数
if(target == 0)
{
target = new char[len + 1];
strncpy(target,src + i,len);
target[len] = '/0';
printf("forward target is :%s,position is :%d,next position is: %d/n",target,i,k);
delete []target;
target = 0;
}
count++;
}
}
//在当前位置的后面一串字符串(不包括当前字符)中遍历
for(k = i + 1;k + len <= length;k++)
{
int j = 0;
bool find = true;
//和后面字符串对比从当前字符串起,长度为最长的所有连续可能字符
for(j = 0;j < len;++j)
{
if(src[i + j] != src[k + j])
{
find = false;
break;
}
}
if(find)
{
//找到一个,输出并计数
if(target == 0)
{
target = new char[len + 1];
strncpy(target,src + i,len);
target[len] = '/0';
printf("follow target is :%s,position is :%d,next position is: %d/n",target,i,k);
delete []target;
target = 0;
}
count++;
}
}
//找到,退出全遍历
if(count > 0)
{
break;
}
}
//找到,退出最长遍历
if(count > 0)
{
//printf("repeat string is : %s, length is :%d/n",strncpy(),len);
printf("repeat string length is :%d/n",len);
break;
}
}
return count;
}
//谨以此帖纪念2007 年4 月份面试该题目失败,反思算法,算法描述和算法实现之间的关系.
//并参考此帖 http://community.csdn.net/Expert/topic/5453/5453623.xml?temp=.2721674
//感触很深,基本的能力和思路真的很重要,当我们写下每条指令的时候,我们一定要深刻的
//知道他要作什么,万幸的是,可能我们现在提供了太多的库,但是,我们的基本能力却越来越低了。
int main(int argc, char* argv[])
{
//bcdghh
//char * source = "aaaapbaaaabcaaaaaanaaaaaAaaaaa";
//char * source = "bcdghddbcdghgfdsAbcdgBAABbcdghFFbcdghhutruytbcdgh";
char * source = "AAAAAAAAAAAAAAAA";
//int jjj = MaxLengthRepeatString(source);
int jjj = MaxLengthRepeatString(source);
printf("%s/n",source);
printf("repeat count is :%d/n",jjj);
}
//更简单的方式是:
假定字符串长度是N,重复字符串的长度最大可能是N/2,这样我们可以转换问题为在
N/2 到N-1 的字符串里面查找 M/2(0<M<=N/2)到1 的重复字符串.算法分析太重要了.