最大公共子串行,最大公共子串,最大回文子串

2021-06-21 07:22:36 字數 1139 閱讀 1106

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。下面的程式是採用矩陣法進行求解的,這對串的規模不大的情況還是比較有效的解法。請分析該解法的思路,並...