1、兩個字串中最長公共子串行
該問題是動態規劃的經典問題,找出的公共序列不一定是連續的,參考資料很多,這裡就貼出公式和**,做個簡單的筆記。
設序列a,b的長度分別為n和m,l(i,j)為a(i),b(j)的最長公共子串行長度,有遞推公式:
時間複雜度為o(mn),**如下:
#define n 50
intlcs(char *a, char *b, char *c)
else
}} }
i=n,j=m;
k=mz[n][m];
c[k--]='\0';
while(i>0 && j>0) }
returnmz[n][m];
}
2、兩個字串中最長公共子串
與公共子串行不同,公共子串是連續的,在使用動態規劃求解2個長度分別為p, q的字串s,t的最長公共子串問題前,先給出求它們任意字首子串對s[1:i],t[1:j]的最長公共字尾的演算法,其中:1 ≤ i ≤ p,1 ≤ j ≤ q。設lcs(s[1:i],t[1:j])表示字首子串對s[1: i] ,t[1:j] 的最長公共字尾,遞推關係式如下:
lcs(s[1:i],t[1,j])=lcs(s[1:i],t[1:j])+s[i] s[i]=t[j]
=」」 s[i]!=t[j]
參考文獻:
**如下:
string getlcs(string &s, string&t)
else if(num[i][j].length()==len)
} }
} for(i=0;i3、最長回文子串
有了最長公共子串的方法,那麼求字串中最長回文子串也變得簡單了,只需要把原字串反轉,然後與求最長公共子串即可。**如下:
//回文字串
string getlcs(string &s)
else if(num[i][j].length()==len)
} }
} for(i=0;i
最大公共子串行
對於兩個字串,請設計乙個高效演算法,求他們的最長公共子串行的長度,這裡的最長公共子串行定義為有兩個序列u1,u2,u3.un和v1,v2,v3.vn,其中ui給定兩個字串a和b,同時給定兩個串的長度n和m,請返回最長公共子串行的長度。保證兩串長度均小於等於300。測試樣例 1a2c3d4b56 10...
最大公共子串
problem description 從乙個給定的串中刪去 不一定連續地刪去 0個或0個以上的字元,剩下地字元按原來順序組成的串。例如 a xb aaa bbb xabb xaaabbb 都是串 xaaabbb 的子串。例子中的串不包含引號。程式設計求n個非空串的最長公共子串的長度。限制 2 n ...
最大公共子串
最大公共子串 最大公共子串長度問題就是 求兩個串的所有子串中能夠匹配上的最大長度是多少。比如 abcdkkk 和 baabcdadabc 可以找到的最長的公共子串是 abcd 所以最大公共子串長度為4。下面的程式是採用矩陣法進行求解的,這對串的規模不大的情況還是比較有效的解法。請分析該解法的思路,並...