求任意字符串最大的重复过的子串

问题描述:给定任意一个字符串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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值