问题描述:给定任意一个字符串SourceStr,n长。求这个字符串中重复过的最长的子串,不过心重复过多少次。
环境 :Windows, VC6.0
PS : 不会贴成代码,自己放到VC中,按Alt+F8对齐。
/*****************************************************************************************
***By : Summon ***
***Data : 2010.1.6 ***
***Version: V1.0 ***
***Fuction: 计算一个字符串中,重复过的最长的子串, ***
*** 不论该子串重复多少次,只关心是否是最长。 ***
***Method : 把一个n长的字符串创建出n组字符串,每组字符串都在前一个字符串的 ***
*** 基础上去掉首字符;把创建出的n组字符串进行类似字典的排序; ***
*** 对比排好序的n组字符串就可以得到我们要找的最长的重复子串了。 ***
******************************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLEN 100
typedef int STATUS;
STATUS InputString(char *&SourceStr);//输入要计算的原始字符串
STATUS OutputStrAndSubstr(char *SourceStr, char *res);//输出原始字符串和计算完的最大的重复过的子串
char **InitSubstringSpace(char *SourceStr, char **SubStr);//根据原始字符串(n长)产生,n组n长的子串
STATUS BubbleSortForOnce(char *SourceStr, char **str, int pos);//对n组n长的子串进行一次Bubble排序
STATUS BubbleSortForAll(char *SourceStr, char **str);//把n组n长的字符串排好序,排完之后类似字典中word的顺序
STATUS ComputerMaxSubStr(char *SourceStr, char **SubStr, char *&resoult);//根据排序完的n组n长的子串,完成最终目的。
int main(int argc, char* argv[])
{
char *SourceStr = NULL;
char **SubStr = NULL;
char *res = NULL;
int ret = -1;
ret = InputString(SourceStr);
SubStr = InitSubstringSpace(SourceStr, SubStr);
ret = BubbleSortForAll(SourceStr, SubStr);
ret = ComputerMaxSubStr(SourceStr, SubStr, res);
ret = OutputStrAndSubstr(SourceStr, res);
return 0;
}
STATUS InputString(char *&SourceStr)
{
SourceStr = (char *)malloc(MAXLEN);
printf("Please input the string within 100 words:");
fflush(stdin);
scanf("%s", SourceStr);
printf("/n");
return 1;
}
STATUS OutputStrAndSubstr(char *SourceStr, char *SubStr)
{
if (SourceStr == NULL || SubStr == NULL)
{
return 0;
}
printf("SourceStr= %s/n", SourceStr);
printf("MaxSubStr= %s/n", SubStr);
return 1;
}
char **InitSubstringSpace(char *SourceStr, char **SubStr)
{
if (SourceStr == NULL)
{
return NULL;
}
int len = strlen(SourceStr);
SubStr = new char * [len];
int j = 0;
while (j < len)
{
SubStr[j] = new char [len];
j++;
}
int count = len;
int temp;
while (count != 0)
{
memcpy(SubStr[len - count], &(SourceStr[len - count]), count);
temp = len - count;
int i = count;
while (temp != 0)
{
SubStr[len - count][i] = '/0';
i++;
temp--;
}
count--;
}
return SubStr;
}
STATUS BubbleSortForOnce(char *SourceStr, char **Versecharacter, int pos)
{//要求character[]每一项的末尾都填满0
if (Versecharacter == NULL)
{
return 0;
}
int count = 0;
int len = strlen(SourceStr);
int flag = 0;
for (int i=0; i<len-1; i++)
{
flag = 0;
for (int j=0; j<len-i-1; j++)
{
if (Versecharacter[j][pos] > Versecharacter[j+1][pos])
{
char *temp = Versecharacter[j+1];
Versecharacter[j+1] = Versecharacter[j];
Versecharacter[j] = temp;
flag = 1;
count++;
}
}
if (flag == 0)
{
break;
}
}
return 1;
}
STATUS BubbleSortForAll(char *SourceStr, char **str)
{
if (SourceStr == NULL || str == NULL)
{
return 0;
}
int len = strlen(SourceStr);
int i = len;
while (i != 0)
{
BubbleSortForOnce(SourceStr, str, i-1);
i--;
}
return 1;
}
STATUS ComputerMaxSubStr(char *SourceStr, char **SubStr, char *&resoult)
{
if (SubStr == NULL)
{
return 0;
}
int len = strlen(SourceStr);
resoult = (char *)malloc(len*sizeof(char) + 1);
int j = 0;
int maxStrLen = 0;
int tempStrLen = 0;
while (j < len -1)
{
int i = 0;
tempStrLen = 0;
while (i < len)
{
if (SubStr[j][i] == SubStr[j + 1][i])
{
tempStrLen++;
}else
{
break;
}
i++;
}
if (tempStrLen > maxStrLen)
{
memcpy(resoult, SubStr[j], tempStrLen);
resoult[tempStrLen] = '/0';
maxStrLen = tempStrLen;
}
j++;
}
return 1;
}