求兩個字串的最大公共字串

2021-04-02 05:50:53 字數 1413 閱讀 4978

今天在csdn上面翻倒乙個問題:求兩個字串的最大公共子串,本來想用有限自動機來做,可惜當年編譯學的不著...-_-b上網翻了翻相關介紹,有乙個演算法很巧妙:

把字串1(長度m)橫排,串2(長度n)豎排,得到乙個m×n的矩陣c,矩陣的每個元素的值如下,如果m[i]=n[j],則c[j][i]=1,否則,c[j][i]=0。然後找出矩陣中連續是1的對角線最長的乙個,則對角線的長度就是公共子串的長度.

經過改進,可以不需要構造矩陣,因為第i行如果有字母匹配,其取值僅與第i-1行相關,若m[i]=n[j],則c[j][i] = c[j-1][i-1] + 1,這樣僅需要記錄乙個長度為m的一維陣列就可以了。

鼓搗出來的**如下:

#include

#include

char * stringsearch( char * str1, char * str2 )

ptempbuffer2 = str2;

while( *ptempbuffer2 != '/0' )

ptempbuffer1 = ( char * ) malloc( str1size );

pwork = ptempbuffer1;

memset( pwork, 0, str1size );

ptempbuffer2 = ( char * ) malloc( str1size );

plast = ptempbuffer2;

memset( plast, 0, str1size );

for( i = 0; i < str2size; i++ )

else

if( resultlength < *( pwork + j ) )

}else

}ptemp = pwork;

pwork = plast;

plast = ptemp;

}retstr = ( char * ) malloc( resultlength + 1 );

memcpy( retstr, str1 + resultindex - resultlength + 1, resultlength );

*( retstr + resultlength ) = '/0';

printf( "resultindex = %d, resultlength = %d/n", resultindex, resultlength );

free( ptempbuffer1 );

free( ptempbuffer2 );

return retstr;

}int main(int argc, char *argv)

為了方便,採用了兩個容量為m的一維陣列來儲存執行中的結果,空間複雜度為m+n+2*m(儲存列印輸出的結果字串可以不需要),也就是o(m+n)。由於需要事先遍歷字串得到長度,演算法複雜度為m*n + m + n,o(m*n)級別。

求兩個字串的最大公共子串

求兩個串中的第乙個最長子串。如 abractyeyt dgdsaeactyey 的最大子串為 actyet 有乙個演算法很巧妙 把字串1 長度m 橫排,串2 長度n 豎排,得到乙個m n的矩陣c,矩陣的每個元素的值如下,如果m i n j 則c j i 1,否則,c j i 0。然後找出矩陣中連續是...

求兩個字串的最大公共子串

求兩個字串的最大公共子串 演算法原理 lcs i,j 0 i 0 j 0 lcs i 1,j 1 i 0 b 0 str1 i str2 j 1 構造乙個str1.size str2.size 的矩陣vec 2 如果 str1 i str2 j 則vec i j vec i 1 j 1 1 lcs ...

求兩個字串的最大公共子串

題目 求兩個字串的最大公共子串.例如字串a abcdefg 字串b cdeab 分析 從兩個字串的那個較短的字串出發,求其全部子串,判斷每乙個子串是不是那個長串的子串,求子串過程本著由長到段的原則,這樣可以保證第一次匹配到的子串就是最大的公共子串。char get common string cha...