字符串编程问题:求连续出现最长字符串问题(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),性能也比之前文章有了提升。代码最后附加了两个测试用例,均可得到满意结果。
- 字符串编程问题:求连续出现最长字符串问题(js实现)
- Trie树的编程实现,用于计算字符串出现次数,求公共前缀字符串等问题
- 重复子串问题(二):求一个字符串中连续出现次数最多的子字符串
- 求两字符串最长公共连续子串---C++编程
- 字符串问题---替换字符串中连续出现的指定字符串
- 求最长连续字串问题
- 求一个字符串的最长连续回文串(模板)
- 字符串中连续出现最长子串
- 编程珠玑(四)求一个字符串中连续出现的次数最多的子串
- 用三重循环求一个字符串的最大回文串(连续重复出现的最长子串)
- 最长回文字符串问题
- 求两个字符串中最长连续子字符串的长度
- 求字符串中连续数字的最长字符串
- 最长的连续相同字符的字符串和最长连续不相同字符的子字符串问题
- 最长公共子序列问题(不要求连续)
- 最长公共子序列问题模板(不要求连续)
- 求两个字符串的最长公共子串(包括连续和非连续)
- 求最长连续子数组问题
- 结构体内存对齐
- iOS编程基础: Hello World App是如何运作的?
- RBAC(Role-Based Access Control,基于角色的访问控制)
- 二分匹配
- sub技巧
- 字符串编程问题:求连续出现最长字符串问题(js实现)
- 黑马程序员----类和对象的一点理解
- 使用STM32的systick定时器中断实现RTC工作过程出错
- 抽象工厂模式
- IOS 消息机制(NSNotificationCenter)
- 线程属性总结
- ftk学习记(button篇)
- hdu 1846 Brave Game(巴什博弈)
- SimpleFormController活动图