查找一个字符串中最大重复子串(C语言版)

来源:互联网 发布:费正清 中国新史 知乎 编辑:程序博客网 时间:2024/05/20 09:09

#include <stdio.h>
#include <string.h>

/* 找出一个字符串最大相同子串,如果有多个重复子串,则要求返回最后一个位置的子串
*/

void print_sub(char *p, int len)
{
 int save_len = len;
 while(len && len--)
 {
  printf("%c ", *p++);
 }
 printf("(%d bytes)\n", save_len);
}

/*  从from开始长度为len的字符串定义为一个子串(from是固定的)
**  则把从to开始,找出是否含有该子串
**  返回最后一个指定长度的子串的位置
**  限定:字符串从左边开始处理,from必需比to小,且没有重叠
*/
const char * search_sub_str(const char * from, const char * to, int len)
{
  const char * same_sub_str = NULL;
  
  if((from + len - 1 >= to)||(from > to))
  {
   printf("check failed in %s\n", __FUNCTION__);
   return NULL;
  }
  
  while(*to)
  {
   if(!strncmp(from, to, len))
   {
    same_sub_str = to;/* 找到最后一个相同子串 */
   }
   to++;
  }
  
  return same_sub_str;
}


int max_sub_str(const char * str, char **p)
{
 const char * s;
 char * result;
 /* 假定用户传递的合格字符串 */
 int  len = strlen(str);
 int  find_len = 0;
 int  sub_len, max = 0;
 int i;
 
 //printf("len = %d\n", len);
 
 for(i = 0; i < len; i++)
 {
  sub_len = 1;
  s = str + i;
  while(sub_len <= len/2)
  {
   /* 针对特定的sub_len长度找出最后一个子串,已经有一个循环 */
   //if((s + sub_len*2) <= str + len)
    result =(char *)search_sub_str(s, s + sub_len, sub_len);
    
   if(result && max < sub_len)/* *p非空表示找到,并且需要更新找到的最大子串长度 */
   {
    *p = result;
    find_len = sub_len;
    max = sub_len;
   }
   sub_len++;
  }
  
 }

 return find_len;
}
/*
** test case :
        1
        11
        abcdabcd
        dafabcdesdfdabcde
        111111111111111
        1111111111111111
        dsjfaworjenafjadsjqwoperjewiorjioqwejrewfddfdfewqrewfd
        dsjfaworjenafjadsjqwoperjewiorjioqwejrewfddfdfewqrewfdxxxrewfd
*/

int main()
{
 char * p = NULL;
 char str[1000] = {};
 int len;
 
 printf("Please input a string:\n");
 if(gets(str) != NULL)
 {
  //printf("string start address is %p\n", str);
  len = max_sub_str(str, &p);
 
  
  //printf("find %p len =%d at last\n", p, len);
  
  if(p)
  {
   printf("max sub string:\n");
   print_sub(p, len);
   printf("pos is %d\n", p - str + 1);
  }
  else
   printf("no max repeat sub string!\n");
 }
 
 return 0;
}

0 0