1. 程式人生 > >求給定字串中最長重複子串

求給定字串中最長重複子串

問題描述:

給定一個字串,如abcdaaabbbaaaabcdbbb,這個串中最長重複子串為abcd;若有多個長度相等的重複子串,只需輸入第一個最長的。

最直觀的演算法設計:

設給定的字串為s=“a1a2a3...an”,則對任意ai,在i+1到n之間查詢aj, s.t. ai=aj,用idx記下此時ai下標,即i;然後依次比較ai+1,ai+2...與aj+1, aj+2是否相同,並記下最長相等的串的長度len,若此長度大於歷史最大長度,則用idx及len更新歷史最優值。重複此過程,直至i>=s.length()。演算法複雜度為O(n^2),應該還有改進空間吧,大家可以寫下自己的思路,一起討論。

基於以上演算法,可以很容易寫出C++版程式碼:

#include <iostream>
#include <cstring>

using namespace std;

void printMaxDuplication(const char* src){
    if(!src){
        return;
    }
    int len = strlen(src);
    //記錄最長重複子串的起始位置以及對應最長的長度
    int idx=0, maxLen=0;
    for(int i =0; i < len; ++i){
        for(int j = i+1, tempLen=0; j < len; ){
            if(src[i] == src[j]){
                //依次比較ai+1與aj+1。ai+2與aj+2
                for(; src[j+tempLen] !='\0' && src[i+tempLen]==src[j+tempLen]; ++tempLen);
                if(tempLen > maxLen){
                    maxLen = tempLen;
                    idx = i;
                }
                j += tempLen;
            }else{
                ++j;
            }
        }
    }
    //print
    for(int i =0; i < maxLen; ++i){
        cout<<src[idx+i];
    }
}

int main(){
    char src[] = "aaacdefgaaaddedefg";
    printMaxDuplication(src);
    return 0;
}


相關推薦

給定字串重複

問題描述: 給定一個字串,如abcdaaabbbaaaabcdbbb,這個串中最長重複子串為abcd;若有多個長度相等的重複子串,只需輸入第一個最長的。 最直觀的演算法設計: 設給定的字串為s=“a1a2a3...an”,則對任意ai,在i+1到n之間查詢aj, s.t.

字串重複

int pstrcmp(const void* p,const void* q) { //qsort要用到,按字典序對子字串排序 return strcmp(*(char**)p,*(char**)q); } int comlen(char* p,char* q) {

字串重複(java)

  -暴力法    兩個指標實現,複雜度O(n^2) package test; import java.util.Scanner; public class Main2 { public static String maxRepat(String str)

字串重複——Java實現

要求:求一個字串的最長重複子串 思路:使用兩個指標,兩個指標的間隔從1,2,3...依次增大, 同時向右移動兩個指標,在移動的過程中判斷指標位置的字元是否相同,並記錄最長子串的長度。 Java程式碼: public class Solution { // 求解字串中的

找出字串重複

一個長度為10000的字串,寫一個演算法,找出最長的重複子串,如abczzacbca,結果是bc。 提示:此題是字尾樹/陣列的典型應用,即是求字尾陣列的height[]的最大值。 #include

字串重複

#if 1 #include <iostream> #include <stdlib.h> using namespace std; int pstrcmp(const

如何字串公共

此演算法的時間複雜度我還沒想清楚, 程式碼如下: #include<stdio.h>#include<string.h> char * maxsamesubstring(char *s1,char *s2){ int i,j,len,maxlen,i

資料結構——一個出現的第一個重複

求一個串中出現的第一個最長重複子串。 輸入串:36123459836121234569 求最長重複子串: 原串:36123459836121234569 最長重複子串:12345 關於這個問題有KMP優化,暫時還沒掌握 下面這個演算法在輸入輸出方面還有待優化 #include <

一個字串當中的重複

#include<stdio.h> #include<string.h> /* 最長重複子串 Longest Repeat Substring */ int maxlen; /* 記錄最長重複子串長度 */ int maxindex;

尋找一個字串重複(字尾陣列)&找出一個字串重複

一、尋找一個字串中的最長重複子串(字尾陣列) 字尾陣列其實可以看尋找一個字串中的最長重複子串(字尾陣列)作一個由字串s倒數i個字元組成的子串的集合,其中0<i<s.length(),例如 字串strstr的字尾陣列為: {r,tr,str,rstr,trstr,

的定順序儲存結構:s出現的第一個重複及其位置

 假設以定長順序儲存結構表示串,試設計一個演算法,求串s中出現的第一個最長重複子串及其位置。 定長順序串SString的型別定義:typedef unsigned char SString[MAXSTRLEN+1]; /* s[0] is the string's le

程式設計珠璣: 15章 字串 15.2尋找字串重複 -------解題總結

#include <iostream> #include <stdio.h> #include <sstream> #include <stdlib.h>//qsort using namespace std; /* 問題:

一個出現的第一個重複

/*exp4-5.cpp*/#include<stdio.h> #include<string.h> #include<malloc.h> #define MaxSize 100 typedef struct {  char ch[Max

字尾陣列重複

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

字串迴文的長度 manacher演算法 模板

https://www.luogu.org/problemnew/show/P3805 #include<bits/stdc++.h> using namespace std; const int maxn=11000002; char S[maxn<<1];

兩個公共字串公共(C++)

思路: 1.按兩字串長度,兩層迴圈 2.每一次迴圈找出潛在的公共字串 (比較笨的方法,但比較好用,也很清楚,程式碼如下) #include<iostream> #include<stdio.h> #include<algorithm>

python實現:兩個字串公共

假設s1 = 'abcdef'  ,s2 = 'mcdea',建立一個(len(s1)+1) x (len(s2)+1)的陣列,如下如所示的一個二維陣列,程式碼的操作流程是: # -*- coding

用字尾陣列兩個字串公共

對於兩個字串,不好直接運用字尾陣列,所以我們可以把兩個子串串中間用一個在字串中不會出現的字元連線起 來,比如'$‘,計算字尾陣列,檢查字尾陣列中所有相鄰字尾。分屬於兩個字串的字尾的lcp的最大值就是答案。 因為字串的任何一個子串都是這個字串某個字尾的字首。求A和B 的最長公

利用KMP演算法,順序表儲存的兩個字串公共

/*程式說明: * 程式是由順序表實現,功能為查詢兩字串中的最長公共子串; * 兩條字串分別由兩個順序表儲存; * 查詢思路是分解出短的那條字串的全部連續子串(例如abc分解為abc,ab,a,bc,b,c), * 再使用kmp演算法將該全部子串與長的那條字串進行匹配,找

重複重複 思路

題目: 求任意一個字串中的所有最長重複字串和所有最長不重複子串 最長不重複子串的解法:        設定一個輔助資料結構(如map)記錄每個字元最後一次出現的位置;遍歷字串中的每個字元,如果在map