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

来源:互联网 发布:unity3d声音不会衰减 编辑:程序博客网 时间:2024/06/06 01:57
 假设以定长顺序存储结构表示串,试设计一个算法,求串s中出现的第一个最长重复子串及其位置。
定长顺序串SString的类型定义:
typedef unsigned char SString[MAXSTRLEN+1];  /* s[0] is the string's length */

实现函数如下:

一、普通算法实现,时间复杂度为O(n^3)

void CommonStr(SString s, SString &sub, int &loc)/* 求串s中出现的第一个最长重复子串sub及其位置loc */{//普通算法实现,时间复杂度为O(n^3)    int length,max,i,j,k;    loc = 0;    max = 0;    for(i = 0; i < s[0]; ++i){        j = i + 1;        while(j <= s[0]){            if(s[i] == s[j]){    //匹配成功,继续查找当前最长重复子串                length = 1;                for(k = 1; s[i+k] == s[j+k]; k++)//找到当前最长重复子串                    length++;    //length当前最长重复子串的长度                if(length >= max){                    loc = i;     //记录出现第一个最长重复子串的位置                    max = length;//记录最长重复子串的长度                }                j = j + length;  //计数器向后移length个单位            }            else                 j++;             //匹配不成功,计数器往后移        }         }               sub[0] = max;     for(i = loc,j =1; i < max; ++i,++j)        sub[j] = s[i];}
二、KMP算法实现,时间复杂度为O(n^2)

void CommonStr(SString s, SString &sub, int &loc)/* 求串s中出现的第一个最长重复子串sub及其位置loc */{//KMP算法实现,时间复杂度为O(n^2)     int next[50];     int i,j,k,len,max;     len = 0;     max = 0;     for(k = 1; k <= s[0]; ++k){        i = k;        j = k - 1;        next[k] = k - 1;        while(i <= s[0]){            if(j == k - 1 || s[i] == s[j]){//模式匹配                ++i;++j;                next[i] = j;                if(s[i] == s[j])                     len = j - k + 1;                else                    len = j - k;                            }            else                j = next[j];//模式串向右移            if(len > max){                loc = k;    //记录出现第一个最长重复子串的位置                max = len;  //记录最长重复子串的长度            }         }     }     sub[0] = max;     for(i = loc,j =1; i < max; ++i,++j)        sub[j] = s[i];}

0 0
原创粉丝点击