字符串编程问题:求连续出现最长字符串问题(js实现)

来源:互联网 发布:成都知美术馆 编辑:程序博客网 时间:2024/06/07 23:12

      在博客园看到一篇文章(点击查看),是关于一道字符串的题目。

   题目:给一个字符串、例如 “ababc”要求返回“ab”. 因为“ab”连续重复出现且最长。 用C/C++语言写一函数完成该算法,给出复杂度。

   分析题目需求,大体分为两部分:

   1.找出连续出现的子串。2.判断满足重复出现且最长的串。

   其中需求1又可以细分为:以串长为标准,找出所有子串;另外一方面,则是如何记录找出的连续出现情况(即采用何种数据结构的问题)。需求2则需要解决:满足连续重复且最长的判断逻辑上。这其中又有两方面:子串长度相等时,记录连续出现次数最多的子串。子串长度更长时,同时有连续存在,则记录这个子串。

   以上是题目需求分析,通过阅读博客园作者文章,不难发现,此作者很好地解决了需求1的问题,但没有解决连续最长的问题。笔者用作者的代码测试“abcdabcdab”这个字符串,如下结果:

   这显然是不满足题目要求的,通过分析作者源码发现,作者的思路是用c++映射的数据结构实现不同子串的存储计数,但是没有区分连续与否的逻辑,造成以上实例中“ef”虽然没有连续,仍然会被当作结果输出。

   笔者用javascript语言,重新书写了这道题目的解法。js语言中用对象来实现关联数组来作为存取子串的数据结构。

function repeat(str){var  map={};var i, j,k=0,m,temp=[];//临时数组var  maxStr='',maxLength=0,maxValue=-1;for(i=1;i<=str.length;i++){for(j=0;j<str.length-i+1;j++){strLength=i;//临时串长temp[k]='';m=j;//此处m单独拿出来,为了不影响j值while(strLength--){temp[k]+=str[m++];};//map[temp[k]]=1;if(map[temp[k]]==undefined)//map相应字符串属性不存在,则新建并定义属性值为1{map[temp[k]]=1;}if((k>=1)&&(temp[k]==temp[k-i]))//通过隔i个字符判断是否存在连续字符串,并使有连续的加1{map[temp[k]]++;}if((temp[k].length==maxLength)&&(map[temp[k]]>maxValue))//如果长度相等,但连续字符串次数最多,那么修改最大连续次数值和最大连续字符串{maxValue=map[temp[k]];maxStr=temp[k];}if((temp[k].length>maxLength)&&(map[temp[k]]>1))//如果长度比之前最大长度长,连续次数大于一,则修改所有最大选项。{maxValue=map[temp[k]];maxStr=temp[k];maxLength=temp[k].length;}k++;        }};//外层循环控制串长,内层循环控制指定串长遍历console.log(maxStr);}repeat('abcdabcdab')repeat('ababcdcd')


   首先要做的是需求1的内容,把子串单独分出来,放入temp数组中,接着用map对象实现子串记录的初始化,子串连续则map对应子串键值加1,并从需求二需要解决的问题入手,用两个if语句实现所求字符串的判断。最后再输出所得字符串。

   不难看出,笔者用两个循环,一次解决了求子串并判断连续重复两个需求的问题,时间复杂度为o(N^2),性能也比之前文章有了提升。代码最后附加了两个测试用例,均可得到满意结果。

0 0
原创粉丝点击