題目 : 給定兩個字串,求出它們之間連續的最長的相同子字串的長度。
eg : fbaabe,ebaabf,連續最長子串長度為4。
注意:求最長回文子串也可以用求最長公共子串來求,只需將字串反轉作為另外乙個字串,回文部分反轉之後不變,然後求lcs(longest common substring)即可。
求最長公共子串通常兩種方法:第一暴力,第二,動態規劃。這裡分別給出。
char* lcs2(char* s1,char* s2)
if (strlen(s1)else
if (strstr(longstr,shortstr) != null)
substr = (char*)malloc(sizeof(char)*(strlen(shortstr)-1));
for (i = strlen(shortstr)-1;i>0;i--)}}
return null;
}
求字串str1,str2的最長公共子串的長度。定義二元函式函式f(m,n):分別以str1[m],str2[n]結尾的連續公共子串的長度
而對於f(m+1,n+1) 有以下種情況:
1.str1[m+1] != str2[n+1],則有f(m+1,n+1) =0
2.str1[m+1] == str2[n+1],則有f(m+1,n+1) = f(m,n) + 1
另外,
f(0,j) = s1[0] == s2[j] ? 1:0 where (j>=0)
f(i,0) = s1[i] == s2[0] ? 1:0 where (j>=0)
按照上面這個公式,我們用容易寫出這個演算法的實現。
void commonstr(char* s1,char* s2)
for (j=0;jif (s1[0] == s2[j])
b(0,j) = 1;
else
b(0,j) = 0;
}max = 0;
for (i=1;ifor (j=1;jif (s1[i] == s2[j])
else}}
char* result = new
char[len1+1];
strncpy(result,&s1[index-max],max);
result[max] = '\0';
cout
<< "最長子串長度:"
<< max << "最長子串:"
<< result << endl;
#undef b
delete b;
delete result;
}
最長公共子串 最長公共子串 動態規劃
有兩個字串 可能包含空格 請找出其中最長的公共連續子串,輸出其長度。長度在1000以內 例如 輸入 abcde bcd 輸出 3 1 把兩個字串分別以行和列組成乙個二維矩陣。2 比較二維矩陣中每個點對應行列字元中否相等,相等的話值設定為1,否則設定為0。3 通過查詢出值為1的最長對角線就能找到最長公...
最長公共子串(動態規劃)
描述 計算兩個字串的最大公共子串 longest common substring 的長度,字元不區分大小寫。輸入 輸入兩個字串 輸出 輸出乙個整數 樣例輸入 asdfas werasdfaswer樣例輸出 6 參考 這裡的最大公共字串要求的字串是連續的。求字串的方法和求子序列方法類似 當s i t...
最長公共子串 動態規劃
題目 給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為1000。示例 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。思想 動態規劃 步驟 第一步 確定子問題。在這一步重點是分析那些變數是隨著問題規模的變小而變小的,那些變數與問題的規模無關。第二步 確定狀態...