求兩個串的第乙個最長公共子串,如「shaohui」,
「ahui
」的最大子串為「
hui」。
方法一:
1、將兩個字串中長度較長的那個字串作為母串strone
,另乙個作為子串
strtwo
。設定 陣列
mask[strone.size()] = ;
用於記錄在母串中找到的與子串
strtwo
匹配的公共子串的長度;
maxlength = 0; end = 0(maxlength
記錄當前找到的最長公共子串長度,
end記錄當前找到的最長公共子串在母串中的結束下標
)2、對於strtwo
串的每乙個字元
strtwo[i]
,從右至左遍歷母串
strone
,如果str[j]
!= strtwo[i]
,mask[j] = 0;
如果str[j] = strtwo[i],
則mask[j] = mask[j-1]+1;
並判斷mask[j]
與maxlength
的大小,若
mask[j]
大,將其賦值給
maxlength
,end = j;
s h a o h u i
初始 0 0 0 0 0 0 0
a 0 0 1 0 0 0 0
h 0 1 0 0 1 0 0
u 0 0 0 0 0 2 0
i 0 0 0 0 0 0 3
得maxlength = 3
,j = 6。
**如下:
//兩個串中的第乙個最長子串
string findlongestcommonsubstring(string strone, string strtwo)
if (strone.length() < strtwo.length()) //strone始終是最長的, 相當於母串,strtwo相當於子串
方法二:若兩個字串為str1,str2.
將字串str1和str2分別寫在兩把直尺上面(我依然用s1,s2來表示這兩把直尺),然後將s1固定,s2的頭部和s1的尾部對齊,然後逐漸移動直尺s2,比較重疊部分的字串中的公共子串的長度,直到直尺s2移動到s1的頭部。在這個過程中求得的最大長度就是s1、s2最大子串的長度。
下圖是求解過程的圖示(下圖按照從下往上,從右至左的順序看,即從最後一排的最後乙個圖往),藍色部分表示重疊的字串,紅色的部分表示重疊部分相同的子串
其中s1="shaohui",s2="ahui",最後求得的結果為3
完整的**如下:
int longest_common_substring(char *str1, char *str2)
curmax = 0;}}
//max = curmax > max ? curmax : max;
if(curmax > max)
}//輸出公共子串
char s[1000];
for(i=0;i
求兩個字串的最長公共子串
問題 有兩個字串str和str2,求出兩個字串中最長公共子串長度。比如 str acbcbcef,str2 abcbced,則str和str2的最長公共子串為bcbce,最長公共子串長度為5。演算法思路 1 把兩個字串分別以行和列組成乙個二維矩陣。2 比較二維矩陣中每個點對應行列字元中否相等,相等的...
求兩個字串的最長公共子串
def longestcommonsequence str one,str two,case sensitive true str one 和 str two 的最長公共子串行 param str one 字串1 param str two 字串2 正確結果 param case sensitive...
求解兩個字串的最長公共子串
求解兩個字串的最長公共子串 比如字串1 helloworld 字串2 hloop 則這兩個字串的最長公共子串行長度為2,最長公共子串行是 lo 問題定義 lcs i j 為以s1 i 與s2 j 為結尾的的最長公共子串的長度 遞推公式 lcs xn,ym lcs xn 1,ym 1 1 if x n...