C++ : 返回两个字符串的最长公共字符串
生活随笔
收集整理的這篇文章主要介紹了
C++ : 返回两个字符串的最长公共字符串
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
原理: x 軸和 y 軸分別取 自身和 str2 然后表格對齊,
相同的字符 設成 1 其他為 0 ,取斜對角線 最長不為 0的字符串極為公共子字符串?
例如asbbefg 和 aubeg 最大值2
| ? | a | s | b | b | e | f | g |
| a | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| u | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| b | 0 | 0 | 1 | 1 | 0 | 0 | 0 |
| e | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
| g | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
由此可以看出,最長非0的斜對角線對應的單元格為 "be"所以 "be"是最長公共子字符串。
可以對算法進行優化:
在對表格進行賦值時,如果str1[i]==str2[j];? ?comparetbl[i] [j] =?comparetbl[i-1] [j-1] +1?
| ? | a | s | b | b | e | f | g |
| a | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| u | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| b | 0 | 0 | 1 | 1 | 0 | 0 | 0 |
| e | 0 | 0 | 0 | 0 | 2 | 0 | 0 |
| g | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
?
inline SString SString::maxCommonSubstr(SString &str2) {//原理: 動態規劃 x 軸和 y 軸分別取 自身和str2//然后表格對齊,相同的字符 設成 1 其他為 0 ,取斜對角線最長不為0//asbbefg 和 aubeg 最大值2/*a s b b e f ga 1 0 0 0 0 0 0u 0 0 0 0 0 0 0b 0 0 1 1 0 0 0e 0 0 0 0 2 0 0g 0 0 0 0 0 0 1*/int len1 = this->length();int len2 = str2.length();if (len1 ==0 || len2 == 0 ){return SString();}int maxlen=-1; //最大長度int lastIndex =-1; //最大值在主串的位置int comparetbl[len2][len1];for (int i = 0; i <len2 ; ++i) {char modelchar=str2[i];for (int j = 0; j < len1; ++j) {if (str_[j]==modelchar){if (i<1 || j<1 ){comparetbl[i][j]=1;}else{comparetbl[i][j]=1+comparetbl[i-1][j-1];}} else{comparetbl[i][j]=0;}if (maxlen<comparetbl[i][j]){maxlen=comparetbl[i][j];lastIndex = j;}}}SString ret = this->subString(lastIndex-maxlen+1,maxlen);return ret;}?
總結
以上是生活随笔為你收集整理的C++ : 返回两个字符串的最长公共字符串的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ 数据结构-图相关操作的算法思路
- 下一篇: C++ : STL常用算法: inner