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中找到仅通过小于或等于一次的特定边的最短路径