• 数据结构——求一个串中出现的第一个最长重复子串


    求一个串中出现的第一个最长重复子串。
    输入串:36123459836121234569
    求最长重复子串:
    原串:36123459836121234569
    最长重复子串:12345

    关于这个问题有KMP优化,暂时还没掌握
    下面这个算法在输入输出方面还有待优化

    #include <stdio.h>
    #define MaxSize 100
    typedef struct {
    	char data[MaxSize]; //串中字符
    	int length; //串长
    } SqString; //声明顺序串类型
    
    void init(SqString &s)
    {
    	s.length=0;
    }
    
    int insert(SqString &s,char a)
    {
    	if(s.length>=MaxSize)
    		return 0;//溢出返回 
    	s.data[s.length++]=a;
    }
    
    void print(SqString s)
    {
    	for(int i=0;i<s.length;i++)
    		printf("%c",s.data[i]);
    	s.data[s.length]='';//这个语句也可以写在主函数里,那样的话只用调用一次 
    
    }
    
    void Longest_substrings(SqString s,SqString &sub)
    {
    	int i,j,k,length,loc=0;
    	for(i=0;i<s.length;i++)
    	{		
    		for(j=i+1;j<s.length;)
    		{
    			if(s.data[i]==s.data[j])
    			{
    				length=1;
    				for(k=1;s.data[i+k]==s.data[j+k];k++)
    					length++;
    				if(length>sub.length)
    				//这里取不取等号决定了是否为第一个最长重复子串
    				{
    					sub.length=length;					
    					loc=i;
    				}
    				j+=length;
    			}
    			else  j++;
    		}
    	}
    	for(i=loc,j=0;i<sub.length+loc;i++,j++)
    	{
    		sub.data[j]=s.data[i];
    	}	
    }
    
    int main()
    {
    	SqString str1,sub1;
    	init(str1);
    	init(sub1);
    	char a[100];
    	gets(a);	
    	for(int i=0;a[i]!='';i++)
    	{
    		insert(str1,a[i]);
    	}
    	Longest_substrings(str1,sub1);
    	print(sub1);
    }
    

    补充的稍微完整主函数如下:

    int main()
    {   
    	char a[100];
    	SqString str1,sub1;
    	init(str1);	init(sub1);
    	printf("输入串:");
    	//gets(a);
    	scanf("%s",a);
    	for(int i=0;a[i]!='';i++)
    	{
    		insert(str1,a[i]);
    	}
    	printf("求最长重复子串:
    ");
    	printf("原串:");
    	//puts(str1.data);
    	printf("%s",str1.data);
    	Longest_substrings(str1,sub1);
    	printf("
    最长重复子串:");
    	print(sub1);
    }
    
  • 相关阅读:
    笨办法学习python之hashmap
    python实现三级菜单源代码
    ql的python学习之路-day3
    ql的python学习之路-day2
    Spring的数据库开发
    Spring学习之Aspectj开发实现AOP
    spring学习之依赖注入DI与控制反转IOC
    spring学习之第一个spring程序
    spring学习之spring入门
    Java线程(一)——创建线程的两种方法
  • 原文地址:https://www.cnblogs.com/vivid-victory/p/10090462.html
Copyright © 2020-2023  润新知