c_cpp 在一个长字符串中,找到出现不止一次的最长子字符串,也称为最长的重复子字符串。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 在一个长字符串中,找到出现不止一次的最长子字符串,也称为最长的重复子字符串。相关的知识,希望对你有一定的参考价值。
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
// the idea is very neat. hard to think of
string longest_repeated_substring(string& s) {
if(s.empty()) return "";
vector<char*> vc;
//for(int i=0; i<s.size(); i++)
// vc.push_back(&s[i]);
for(char& c : s) // add pointers to each char to a vector
vc.push_back(&c);
sort(vc.begin(), vc.end(), [](char *a, char *b) { return *a < *b; });
int max_len = 0, start = 0;
char *last = &s[s.size()-1];
for(int i=0; i<vc.size()-1; i++) {
char *a = vc[i], *b = vc[i+1];
int len = 0;
while(a <= last && b <= last && *a == *b) { // allow overlap
// while(a <= last && b <= last && a < vc[i+1] && *a == *b) { // don't allow overlap
a++, b++;
len++;
if(max_len < len) {
max_len = len;
start = vc[i] - &s[0]; // gist, not i
}
}
}
if(max_len == 0) return "";
return s.substr(start, max_len);
}
int main()
{
string s = "bababa";
cout << longest_repeated_substring(s);
}
以上是关于c_cpp 在一个长字符串中,找到出现不止一次的最长子字符串,也称为最长的重复子字符串。的主要内容,如果未能解决你的问题,请参考以下文章
最强解析面试题:第一个只出现一次的字符
最强解析面试题:第一个只出现一次的字符
在一个字符串中找到第一个只出现一次的字符
题解-CodeForces700E Cool Slogans
第一个只出现一次的字符
在Graph中找到仅通过小于或等于一次的特定边的最短路径