采用顺序结构存储串,设计实现求串S和串T的一个最长公共子串的算法(C语言)

内容:

     采用顺序结构存储串,设计实现求串S和串T的一个最长公共子串的算法

步骤:

1.算法分析:

       直观看来,这个问题与KMP算法有些类似,但是仔细看来还是有差别的,而且这个题目要求使用顺序结构完成算法,所以还是需要仔细分析,因为是要求最长公共子串,而在比对的过程中,可能会出现多个子串,所以需要设置一个计数器,记下来每一步的最大公共串数目,并且和前面的最大数目比较,若大于前面的,则保持不变,若小于前面的,则将前者的大小赋值给计数器。

       对于两个串,我们可以分别设置两个指针指向它们,不妨设置串S为i指针,串T为j指针因为这个过程要进行多次比较,所以使用3个while循环以及一些if语句进行判断,第一个是i指针等于1时,进入循环,在这个循环中设置第二个while循环,即当i指针指向1时,j指针遍历,且当存在相同的部分时,进入第三个while循环,继续比较,如果依然存在相同的,计数器+1,当不满足相等的条件时,在对最大公共串做一个if语句的比较,将最大的长度赋值给计数器。此时,第三个while语句暂时完成,然后将j指针向右移动k,此时在进行j++操作,如此在对第三个while循环遍历,直到j<=t.len不满足时,暂时退出第二个while循环,至此,只是完成了第一个while循环的i=1的情况。因为还没有满足i<=s.len,所以循环继续进行,直到i<=s.len不满足时,整个的算法完成,所有遍历均完成,输出此时计数器最大的值,该值为最长的公共子串。即为最长的公共子串的算法。

       算法要求采用顺序存储结构求解串S和串T的最大公共子串。串S用i指针(1<=i<=s.len)。串t用j指针 (1<=j<=t.len).对于每个i(1<=i<=s.len),求从i开始的连续字符串与从j(1<=j<=t.len)开始的连续字符串的最大匹配。当s中某个字符(s[i])与t中某字符(t[j])相等时,求出局部公共子串。若该字串长度大于已求出的最大公共子串(初始为0),则最长公共子串的长度要修改。

2.算法的程序流程图:

3.算法源代码: 

  void maxcomstr(orderstring *s,*t;int index,length)
   {
   	int i,j,k,length1,con;
   	index=0;length=0;i=1;
   	while(i<=s.len)
   	  {
   	  	j=1;
   	  	 while(j<=t.len)
   	  	  {
   	  	  	if(s[i]==t[j])
   	  	  	  {
   	  	  	  	k=1;length1=1;con=1;
   	  	  	  	while(con)
   	  	  	  	    if(i+k<=s.len&&j+k<=t.len&&s[i+k]==t[j+K])
   	  	  	  	    {
   	  	  	  	    	length1=length1+1;
   	  	  	  	    	k=k+1;
					}
					else con=0;
					if(length1>length)
					{
						index=i;
						length=length1;
					}
					j+=k;
			  }
			  else j++
		  }
		  i++;
		 }
	} 

 4.总结

       其实看来,这个算法时间复杂度挺高的,时间主要花在了3个while循环的遍历上,所以浪费了大量的时间,其实也可以使用动态规划解决这道题,但是因为这道题的要求是采用顺序存储结构,所以只能这么复杂。

Guess you like

Origin blog.csdn.net/qbyyds/article/details/121067613