zoukankan      html  css  js  c++  java
  • 后缀数组求字符串最长重复子串

    求一个字符串的最长重复子串:

    1.求字符串s的后缀数组suffix

    2.suffix排序

    3.求最长公共前缀

    #include<iostream>
    #include<fstream>
    #include<string>
    #include<vector>
    #include<deque>
    #include<queue>
    #include<stack>
    #include<map>
    #include<set>
    #include<unordered_map>
    #include<unordered_set>
    #include<algorithm>
    using namespace std;
    
    int comlen(string s1,string s2)
    {
    	//计算两个字符串的最长公共前缀
    	int i=0,j=0;
    	int len=0;
    	while(i<s1.size()&&j<s2.size())
    	{
    		if(s1[i]==s2[i]) 
    	    {
    			i++;j++;
    			len++;
    		}
    		else return len;
    	}
    	return len;
    }
    
    string FindRepeatSubstr(string s)
    {
    	vector<string> suffix; //后缀数组
    	string ans;
    	int len=0;
    	int maxlen=0;
    	int i;
    	for(i=0;i<s.size();i++)
    	{
    		suffix.push_back(s.substr(i,s.size()-i));
    	}
    	sort(suffix.begin(),suffix.end()); //给后缀数组排序
    	for(i=0;i<suffix.size()-1;i++) //计算相邻两个后缀数组的最长公共前缀
    	{
    		len=comlen(suffix[i],suffix[i+1]);
    		if(len>maxlen)
    		{
    			maxlen=len;
    			ans=suffix[i].substr(0,maxlen);
    		}
    	}
    	return ans;
    }
    
    int main()
    {
    	string str;
    	while(cin>>str)
    	{
    		if(str=="") cout<<""<<endl;
    		cout<<FindRepeatSubstr(str)<<endl;
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    第六次学习笔记
    第四篇笔记
    第三篇学习笔记
    第二篇学习笔记
    第一篇学习笔记
    px与dp、sp之间的转换
    SQLite的使用(二):数据增删改查
    Logcat的级别以及Logcat的调试使用
    Android 创建服务(一)
    简说SQLite
  • 原文地址:https://www.cnblogs.com/Rosanna/p/3685564.html
Copyright © 2011-2022 走看看