字符串编程问题:求连续出现最长字符串问题(js实现)
2014-05-05 21:38
127 查看
在博客园看到一篇文章(点击查看),是关于一道字符串的题目。
题目:给一个字符串、例如 “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),性能也比之前文章有了提升。代码最后附加了两个测试用例,均可得到满意结果。
相关文章推荐
- 【字符串处理算法】最长连续字符及其出现次数的算法设计及C代码实现
- 某公司笔试题:编程实现去除字符串中连续出现一次以上的空格。
- Trie树的编程实现,用于计算字符串出现次数,求公共前缀字符串等问题
- 编程实现:从字符中获取连续数组序列,如字符串"a1dl2iad9j3la5kudp7u9pn4blj8ap5u3e6ml9a"中可以得到的连续数字序列为1234556.【注】:只考虑一位,因此最长的数
- 实现简单的输入编辑,录入正确的字符串,出现‘$’,表示撤销前一个输入,发现连续的‘$’,表示连续撤销前面的输入;发现‘%’,表示放弃前面所有录入;生成最终结果。
- 求字符串中出现次数最多且最长的子串、连续出现次数最多的子串
- JS编程-寻找字符串中出现最多的字符以及重复次数
- 实现简易字符串压缩算法:一个长度最大为128的字符串, 由字母a-z或者A-Z组成,将其中连续出现2次以上(含2次)的字母转换为字母和出现次数,以达到压缩目的
- 用递归实现查找字符串中相同字符连续出现次数的最大值
- Java字符串编程--最长连续字母序列的长度
- 用递归实现查找字符串中相同字符连续出现次数的最大值
- 最长的连续相同字符的字符串和最长连续不相同字符的子字符串问题
- 输入字符串(由0,1组成),编程计算其中连续0,1出现的最大次数
- 在一个字符串中找出以同样的顺序连续出现在另一个字符串中的最长连续字符串的长度
- 字符串问题---去掉字符串中连续出现k个0的子串
- js实现找出字符串中出现字数最多的字符并计算其出现次数
- 找到二进制字符串中连续最长'0'出现位置
- 实现简单的输入编辑,录入正确的字符串,出现‘$’,表示撤销前一个输入, 发现连续的‘$’,表示连续撤销前面的输入;发现‘%’,表示放弃前面所有录入; 生成最终结果。
- js实现从字符串中查找出现次数最多的字符的两种解决办法
- 字符串中最长的连续出现的字符