今天在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...