求串的第一个最长重复子串的下标和长度

原创 2015年11月17日 16:02:57

/*
采用顺序结构存储串,编写一个程序,求串s中出现的第一个最长重复子串的下标和长度。


1.读取串
2.求后缀数组
3.字典序排序所有后缀
4.求相邻后缀最长子串
5.比较本次结果与上次结果,取最大
*/


#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<map>
#include<fstream>


using namespace std;


typedef vector<string>::iterator ITER;//从定义类型


class max_substr
{
public:
max_substr(){}


~max_substr(){}

//文件读入串
void getstr(string name)
{
ifstream readfile;
readfile.open(name, ios::in);
if (readfile.is_open())//是否打开
{
getline(readfile, s);//读取一行
cout << s << endl;
}
readfile.close();
}


void solve()
{
int temp, max;
string t, max_t;


//得到后缀数组
for (size_t i = 0; i<s.size(); ++i)
{
t = s.substr(i, s.size());//求后缀
behind.push_back(t);
rank.insert(pair<string, int>(t, i));//存储后缀及其首字符下标
}
stable_sort(behind.begin(), behind.end());//按字典序排序,默认为从小到大
max = -1;
//迭代比较相邻两后缀
for (iter = behind.begin(); *iter != behind.back(); ++iter)
{
temp = MaxPrefix(iter, iter + 1);//取最长子串尾字符下标
if (temp>max)//与前一个比较,取最长
{
max = temp;
max_i = iter;
}
}


for (int i = 0; i<max; ++i)//取出重复串
max_t += (*max_i)[i];
cout << "长度为:" << max << endl;
cout << "下标为:" << rank[max_t] << endl;
cout << max_t << endl;
}


private:
string s;
vector<string> behind;//后缀数组
map<string, int> rank;//关联容器
ITER iter, max_i;//迭代/保存字符地址位置


//得到相邻两串最长公共字符子串尾下标
int MaxPrefix(ITER s1, ITER s2)
{
int i = 0;
while (!(*s1).empty() && (*s1)[i] == (*s2)[i])//当前字符相等比较下一位
{
++i;
}
return i;
}
};


int main()
{
max_substr str;
str.getstr("data");
str.solve();
return 0;
}


测试结果



版权声明:本文为博主原创文章,转载请注明出处,否则予以追究。

求串S中出现的第一个最长重复子串及其位置。

例题算法求串S中出现的第一个最长重复子串及其位置。"重复子串":SubString(S,i,len)==SubString(S,j,len)&1如S=aaaaaa的最长重复子串为T=aaaaa其算法有...
  • Dark_Blue_Sea
  • Dark_Blue_Sea
  • 2007年04月25日 00:16
  • 1146

求一个串中出现的第一个最长重复子串

/* ** ** 求一个串中出现的第一个最长重复子串。采用顺序结构存储串,实现求串s中出现的第一个最长重复子串的下标和长度 ** */ #include #include using names...
  • wbxcww
  • wbxcww
  • 2011年10月16日 10:42
  • 1562

串的定长顺序存储结构:求串s中出现的第一个最长重复子串及其位置

假设以定长顺序存储结构表示串,试设计一个算法,求串s中出现的第一个最长重复子串及其位置,并分析你的算法的时间复杂度。 定长顺序串SString的类型定义: typedef unsigned c...
  • u013228403
  • u013228403
  • 2014年05月01日 11:27
  • 2483

刷清橙OJ--A1038.超级重复串

问题: A1038. 超级重复串 时间限制:1.0s   内存限制:512.0MB   总提交次数:2665   AC次数:978   平均分:61.01 问题描述   给定一个仅包含小...
  • qq_31725785
  • qq_31725785
  • 2017年05月30日 11:20
  • 211

最长不重复子串的长度&最长重复子串

求给定的某一个字符串中的最长不重复子串的长度。 例如字符串s为:“abcdefgegcsgcasse”,其最长的不重复子串为“abcdefg”,长度为7 最长不重复子串的解法一: ...
  • jiyanfeng1
  • jiyanfeng1
  • 2012年10月12日 14:35
  • 2774

给定一个字符串,求出其最长的重复子串的长度

题目来源:这是编程珠玑上的一道题目概念字符串的前缀和后缀例如字符串 s =“abcdeabc” 则s的前缀: “a”,“ab”,“abc”,“abcd”,“abcde”,“abcdea”,“abc...
  • renwotao2009
  • renwotao2009
  • 2016年11月05日 11:55
  • 2864

字符串中连续出现最多的子串 & 字符串中最长重复子串

字符串中连续出现最多的子串 & 字符串中最长重复子串     字符串中连续出现最多的子串 & 字符串中最长重复子串,这两个问题都可以用后缀数组来表示,至于后缀数组可以参考编程珠玑P156;后缀数组就...
  • xwchao2014
  • xwchao2014
  • 2015年08月18日 21:20
  • 1506

数据结构——算法之(032)(求两个串中的第一个最长子串)

【申明:本文仅限于自我归纳总结和相互交流,有纰漏还望各位指出。 联系邮箱:Mr_chenping@163.com】 题目: 求两个串中的第一个最长子串(神州数码以前试题).如"abract...
  • mr_chenping
  • mr_chenping
  • 2014年06月17日 09:44
  • 1138

求最长重复子串的长度

给定一个字符串,求最长重复子串的长度。(最长重复字串之间可以有重叠的部分,如ababa,最长重复子串为aba,长度为3) 如果程序至多可以处理MAXN个字符,这些字符被存储在数组c中: #defi...
  • usernamecontroled
  • usernamecontroled
  • 2012年10月04日 22:58
  • 238

【kmp算法】求一个串的重复子串

B - KMP求一个串的重复子串 Time Limit:3000MS     Memory Limit:30000KB     64bit IO Format:%lld & %llu Submit ...
  • jchangbrave
  • jchangbrave
  • 2016年08月21日 17:34
  • 115
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:求串的第一个最长重复子串的下标和长度
举报原因:
原因补充:

(最多只允许输入30个字)