1. 程式人生 > >最長重複子串問題

最長重複子串問題

最長重複子串是指在一個字串中找出最長的出現兩次或兩次以上的子串,例如abcdeabbcde,則bcde則是最長的重複子串。

最直觀的解法是窮舉所有的子串,和原串進行對比,從而選出最長的重複子串。

#include <stdio.h>
#include <string.h>


int commonLen(const char *str1, const char *str2){
        int len = 0;
        if(str1 == NULL || str2 == NULL){
                return 0;
        }
        while(*str1 && * str2 && *str1 == *str2){
                str1++;
                str2++;
                len++;
        }
        return len;
}

int LRS(const char *str){
        if(str == NULL){
                return 0;
        }
        int i, j;
        int maxlen = 0, curlen = 0, maxindex = 0;
        int len = strlen(str);
        for(i = 0; i < len; i++){
                for(j = i + 1; j < len; j++){
                        curlen = commonLen(str + i, str + j);
                        if(curlen > maxlen){
                                maxlen = curlen;
                                maxindex = i;
                        }
                }
        }
        for(i = 0; i < maxlen; i++){
                printf("%c", *(str + maxindex + i));
        }
        return maxlen;
}

int main(){
        char *str = "abcdeabbcde";
        int len = LRS(str);
        printf("Max LRS = %d\n", len);
}
這種演算法的效率是O(N^3),效率不高,使用過KMP演算法的同學會聯想到這其實就是在求next陣列的最大值問題,例如“abcdabcde”,它的next陣列為:

-1      0       0       0       0       1       2       3       4       0

各個子串的next陣列的最大值就是最長重複子串的長度。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int maxNext(const char *s, int _next[]){
        _next[0] = -1;
        int i = 0;
        int j = -1;
        int max = 0;
        int len = strlen(s);
        while(i < len){
                if(j == -1 || s[i] == s[j]){
                        i++;
                        j++;
                        _next[i] = j;
                        if(j > max){
                                max = j;
                        }
                }else{
                        j = _next[j];
                }
        }
        return max;
}

int LRS_KMP(const char *str){
        int len = strlen(str);
        int index = 0;
        int max = 0;
        int maxindex = 0;
        int *_next = (int *)malloc(len * sizeof(int));
        int i;
        for(i = 0; i < len - 1; i++){
                int curmax = maxNext(str + i, _next);
                if(curmax > max){
                        max = curmax;
                        maxindex = i;
                }
        }
        for(i = 0; i < max; i++){
                printf("%c", *(str + maxindex + i));
        }
        return max;
}

int main(){
        char *str = "abaabaaabaaaab";
        int len = LRS_KMP(str);
        printf("Max LRS = %d\n", len);
}


相關推薦

字尾陣列求重複

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

資料結構/重複

基本方法、KMP演算法求解、字尾陣列求解 求字串的最長重複子串 例如:aaaaaaaaabbbbcccaaassscvvv這裡面的最長重複子串為aaaaaaaaa 演算法思路:演算法時間複雜度(O(n)) 1. 將這一個字串先轉成char陣列; 2. 將這一char陣列進行遍歷

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

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

重複重複 思路

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

求字串的重複

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

找出字串的重複

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

字串的重複

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

求一個字串當中的重複

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

求字串的重複(java)

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

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

一、尋找一個字串中的最長重複子串(字尾陣列) 字尾陣列其實可以看尋找一個字串中的最長重複子串(字尾陣列)作一個由字串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; /* 問題:

尋找重複——Python

題目描述: 給定一個字串,找出其中最長重複字串,以元組形式返回結果。例如,給定“aaaabb”,最長重複子串為“aaaa”,返回結果為('a',4)。 解題思路: 將字串中每個字元向後的重複次數列出,其中的最大值即為最長重複串的長度,對應的字元即為重複字元。例如:

求給定字串中重複

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

重複問題

最長重複子串是指在一個字串中找出最長的出現兩次或兩次以上的子串,例如abcdeabbcde,則bcde則是最長的重複子串。 最直觀的解法是窮舉所有的子串,和原串進行對比,從而選出最長的重複子串。 #include <stdio.h> #include <s

重複(可重疊)

首先這是一個單字串問題。子字串R 在字串L 中至少出現兩次,則稱R 是L 的重複子串。重複子串又分為可重疊重複子串和不可重疊重複子串,這裡只是簡單討論最長可重疊的重複子串.首先,最直接的方法就是子串和子串間相互比較,這樣檢視所有的子串對,時間複雜度為O(n^2)。最快的方

求字串的重複——Java實現

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

求一個中出現的第一個重複

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

給定一個字串,找出不含有重複字元的長子的長度。 示例: 給定 "abcabcbb" ,沒有重複字元的長子是 "abc" ,那麼長度就是3。 給定 "bbbbb" ,就是 "b

Str = raw_input('plese input Str:') def qiu_chongfu(Str2):#定義判斷字串是否含有重複字元,如有返回0,沒有返回1 biao = 0 for i in range(0,len(Str2)): for j in

[Hihocoder](1415)字尾陣列三·重複旋律3 ---- 字尾陣列(公共)

題目傳送門 做法: 我們知道,字串中任意一個子串都是某個字尾的字首 我們也知道了Height陣列的含義是排名為i的字尾與排名i-1的字尾的最長公共字首,即就是最長公共子串。 現在題意讓我們找兩個串的最