第五十六題(最長公共子串)

2021-06-22 14:45:10 字數 1197 閱讀 7831

最長公共字串。

題目:如果字串一的所有字元按其在字串中的順序出現在另外乙個字串二中,

則字串一稱之為字串二的子串。

注意,並不要求子串(字串一)的字元必須連續出現在字串二中。

請編寫乙個函式,輸入兩個字串,求它們的最長公共子串,並列印出最長公共子串。

例如:輸入兩個字串bdcaba 和abcbdab,字串bcba 和bdab 都是是它們的最長公共子串,則輸出它們的長度4,並列印任意乙個子串。

可以使用遞迴或者動態規劃求解,遞迴會重複求解重疊子問題,大量的重複操作導致演算法效率很低,對於長度分別為m,n的字串,二叉遞迴樹的高度為m+n,因此採用遞迴方法的複雜度達到o(2^(m+n))。

動態規劃方法採用二維陣列來記錄前一步的計算結果,避免了重複計算,通過兩個for迴圈就可以解決問題,演算法複雜度o(mn)。

最後通過回溯操作獲取具體的子串。

具體的演算法原理網上有很多經典講解,這裡不再贅述。

c++實現**:

#include "stdafx.h"

#include /*動態規劃解決最長公共子串行的問題*/

namespace longestcommonsubsequence

} //採用動態規劃的方法

enum direction ;

void printlcs(const char* s1,direction** dpdir, int i, int j)

else if (dpdir[i][j] == up)

printlcs(s1, dpdir, i-1, j);

else

printlcs(s1, dpdir, i, j-1);

} int lcs_dp(const char* s1, const const char* s2)

else if (dp[i - 1][j] >=dp[i][j - 1])

else

}printlcs(s1, dpdir, len1, len2);

return dp[len1][len2];

} void test() }

int _tmain(int argc, _tchar* argv)

程式執行結果:

最長公共子串行 微軟面試100題 第五十六題

題目要求 如果字串一的所有字元按其在字串中的順序出現在另外乙個字串中,則字串一稱為字串二的子串。注意,並不是要求子串 字串一 的字元必須連續出現在字串二中。請編寫乙個函式,輸入兩個字串,求它們的最長公共子串行,並列印出最長公共序列。例如 輸入兩個字串bdcaba和abcbdab,字串bcba bda...

最長公共子串行 微軟面試100題 第五十六題

題目要求 如果字串一的所有字元按其在字串中的順序出現在另外乙個字串中,則字串一稱為字串二的子串。注意,並不是要求子串 字串一 的字元必須連續出現在字串二中。請編寫乙個函式,輸入兩個字串,求它們的最長公共子串行,並列印出最長公共序列。例如 輸入兩個字串bdcaba和abcbdab,字串bcba bda...

解題思路 leetcode第五十六題 合併區間

給出乙個區間的集合,請合併所有重疊的區間。示例 1 輸入 1,3 2,6 8,10 15,18 輸出 1,6 8,10 15,18 解釋 區間 1,3 和 2,6 重疊,將它們合併為 1,6 示例 2 輸入 1,4 4,5 輸出 1,5 解釋 區間 1,4 和 4,5 可被視為重疊區間。解題思路 本...