正文

不重叠地重复出现次数最多的子串2008-03-23 13:45:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/zhaoyg/33531.html

分享到:

/*
P.S: 这是我第一次参加论坛组织的比赛,此题是第52次的题目,虽然没有什么效率,但值得庆幸的是我的程序最后还通过了两组测试数据

给出一个由小写字母组成的串s和一个不超过s的长度的正整数l,求s所有长度不小于l的字串中在s中不重叠地重复出现次数最多的子串。只要输出这个子串出现的次数就行了。

特别强调:子串不是子序列,必须是从s截出来连续的一段。s也是自身的子串。

例如

s = "abcabc", l = 3,

那么输出2,因为所求的子串是abc。

再例如

s = "ababa", l = 3,

那么输出1,长度不小于3的字串包括aba, bab, abab, baba, ababa。其中后面四个显然都只出现一次。前一个aba和后一个aba重叠了一个a,所以只能算不重叠地出现了一次。

实现接口

int solve(const char *s, int l);

s和l意思如上。通过返回值返回答案。
*/
#include<stdio.h>

int solve(const char *s, int l);
int main()
{
    char s[]="jfurhgyaopylhijknmbjhutyaopglhkyinjbaopfjguthfaopkbmvnchfaop";
    int l;
   // printf("enter characters\n");
   // scanf("%s",s);
    printf("enter l\n");
    scanf("%d",&l);
    printf("%d",solve(s,l));
    getchar();getchar();
    return 0;
}

int solve(const char *s, int l)
{
    int max=1,c;
    int i,j,k,t=0,lenth,take,ls,p,t1=0;
    //ls为原始字符串的长度
     int a[10000];
    //读取样本字符串的数组
    int count1=0,count[10000]={0};
    //count数组记录样本字符串在原字符串中出现的次数,当其为0是表示只有一个
   
    int temp;
   
    for (ls=0;s[ls];ls++) //计算原字符串长度
    ;

    for (i=0;i<=ls-l;i++)  //此处i用来控制启示位置,ls-l表示样本字符串活动范围
    {  
  for (lenth=l;lenth<=ls-i;lenth++)  //lenth表示样本字符串的长度
        {
   for (take=i,p=0;take<lenth+i;take++,p++)  //读取起始位置为i长度为lenth的字符串
            {
    a[p]=s[take];printf( "%c",a[p]);
            }
            printf("\n");
            t1++; //为数组count序号
           
            for (j=0;j<=ls-lenth;)  //在原字符串中开始寻找一样的样本字符串
            {
                for (k=j,p=0;k<lenth+j;k++,p++)
                {
                    if (a[p]==s[k]) 
                    {
                        count1++; //统计在同样长度下相同字符的个数
                    }
                    else
                    {
                        count1=0;
                        break;
                    }
                }

                if (count1==lenth)  //成立则表明有相同的字符串
                {
     t++;  //t为次数
     //count[t1]=t;printf("t1=%d %d\n",t1,count[t1]);
     if (t>max) max=t;
                    j=j+lenth;// 避免出现重叠例如"ababa" 只能算出现一次"aba"
     count1=0;
                }
               
                else j++;
   }printf("\n");
   t=0;//使次数归零
          }
     } 
    
    /* for (i=0;i<t1;i++)//从大到小排序
     {
         for (j=0;j<t1;j++)
         {
             if (count[j]<count[j+1])
             {
                 temp=count[j];
                 count[j]=count[j+1];
                 count[j+1]=temp;
             }
            // printf("%d",count[j]);
         }
         //printf("\n");
     }*/
     printf("最大次数为%d\n",max);
     return 0;//count[0]; //返回最大的次数
}

阅读(6420) | 评论(2)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册