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

原创 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中出现的第一个最长重复子串的下标和长度 ** */ #include #include using names...
  • wbxcww
  • wbxcww
  • 2011年10月16日 10:42
  • 1472

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

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

长度最长的重复字符串

今天在面试宝典上看到这么一道题: 编程:输入一行字符串,找出其中出现的相同且长度最长的字符串,输出它及其首字符的位置。例如“yyabcdabjcabceg”,输出结果应该为abc和3。   完整...
  • mywave0
  • mywave0
  • 2014年01月07日 22:38
  • 258

求一个串中出现的第一个最长可重叠重复子串 [后缀数组解法]

题目描述:求一个串中出现的第一个最长重复子串 采用顺序结构存储串,编写一个程序,求串s中出现的第一个最长重复子串的下标和长度。 求解思路:一、主要数据结构及涉及知识点核心结构:后缀数组其他涉及:str...

串的定长顺序存储结构:实现串的基本操作Replace(&S,T,V)

编写算法,实现串的基本操作Replace(&S,T,V)。要求采用以下所定义的定长顺序存储表示,但不允许调用串的基本操作。 定长顺序串SString的类型定义:...

编写算法,对给定的字符串str,返回其最长重复子串及其下标位置

编写算法,对给定的字符串str,返回其最长重复子串及其下标位置。*/ 例如,str="abcdacdac",则子串"cdac"是str中最长的重复子串,下标为2*/...

寻找一个字符串中的最长重复子串

思路: 主要就是先定义一个后缀数组,将后缀数组排序后求共最长公共长度 问题描述: 首先这是一个单字符串问题。子字符串 R 在字符串 L 中至少出现两次,则称 R 是 L 的重复子串。比...

求一个串中出现的第一个最长可重叠重复子串 [后缀数组解法]

http://blog.csdn.net/iamskying/article/details/4759485   题目描述: 求一个串中出现的第一个最长重复子串 采用顺序结...

寻找字符串s中第一个最长的重复子串及其位置

寻找s中第一个最长的重复子串及其位置 #include "stdafx.h" void maxoverlapstr(char *s,int *pos,int *max) { int i...

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

例题算法求串S中出现的第一个最长重复子串及其位置。"重复子串":SubString(S,i,len)==SubString(S,j,len)&1如S=aaaaaa的最长重复子串为T=aaaaa其算法有...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:求串的第一个最长重复子串的下标和长度
举报原因:
原因补充:

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