您的位置:首页 > Web前端 > JavaScript

字符串编程问题:求连续出现最长字符串问题(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),性能也比之前文章有了提升。代码最后附加了两个测试用例,均可得到满意结果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐