最長公共子串和最長公共子串行

2021-06-09 21:36:10 字數 1560 閱讀 2828

二者含義沒搞清楚,雅虎的筆試就這樣的寫錯了。

求最長公共字串的題目寫成了最長公共子串行。

子串要求字元必須是連續的,但是子串行就不是這樣了。悲催了。

子串行跟子串的求法類似,都是使用動態規劃的思想,s1每次增加乙個字元,看與s2當前位置的字元是不是相同,如果相同做相應的處理,如果不同,做另外的處理。

子串行的處理方式:

相同的情況下,該二維陣列的位置等於[i-1][j-1]+1

不同的情況下,該二維陣列的位置等於max(d[i-1][j],d[i][j-1])

下面描述下子串的求法。

最長公共子串,要求字元是連續的。那麼在[s1每次增加乙個字元,看與s2當前位置的字元是不是相同]

相同的情況下,二維陣列的位置等於[i-1][j-1]+1,

不同的情況下,二維陣列的位置等於0,最後再檢視二維陣列的資訊即可得到最長公共子串的長度,同時可以回溯二維陣列得到最長公共字串的內容。

package innerclass;

public class tt

private static void get(string s1, string s2)

for (int i = 0; i < s2.length() + 1; i++)

for (int i = 1; i <= s1.length(); i++)

} else

}} // 方便觀察,輸出二維矩陣

for (int i = 0; i < s1.length() + 1; i++)

system.out.println();

} // 輸出最長子串

stringbuilder sb = new stringbuilder();

while (flag[pos_x][pos_y] != 0)

system.out.println(sb.tostring());

}}

程式最後輸出的是最長公共子串的逆序,把字串倒轉過來就是所求的了。**還是比較簡便的。

如果只是想求出最長公共子串的長度而不求子串是什麼,可以把二維陣列壓縮到只需要兩行的二維陣列。最長公共子串行的回溯過程與最長公共子串的不同。子串只需要簡單的回溯到flag陣列不是1的時候就可以了。子串行的回溯,在flag陣列中需要有三個方向,乙個是向上(flag[i-1][j]),乙個是向左(flag[i][j-1]),還有乙個是向左上角(flag[i-1][j-1]),回溯直到flag是0為止。

-----------------------------------分擔個--------------------------------------

最長公共子串的求法,還有一種就是用字尾陣列。

假設兩個字串為a和b,用乙個在兩個字串中都沒有出現的字元作為分隔形成乙個字串c=a#b,那麼求c的字尾陣列,先求字尾陣列,再求出height陣列【求height陣列的時候,相鄰的兩個字尾只有乙個包含#,另外乙個不包含#,才求他們的height陣列的值。(這是因為,如果兩個都包含#,那麼求出來的最長公共字首就包含了a中的字元)】。height陣列求出之後,其中的最大值就是ab兩個字串的最長公共字串的長度了。

最長公共子串行 最長公共子串

1 最長公共子串行 採用動態規劃的思想,用乙個陣列dp i j 記錄a字串中i 1位置到b字串中j 1位置的最長公共子串行,若a i 1 b j 1 那麼dp i j dp i 1 j 1 1,若不相同,那麼dp i j 就是dp i 1 j 和dp i j 1 中的較大者。class lcs el...

最長公共子串行 最長公共子串

1.區別 找兩個字串的最長公共子串,這個子串要求在原字串中是連續的。而最長公共子串行則並不要求連續。2 最長公共子串 其實這是乙個序貫決策問題,可以用動態規劃來求解。我們採用乙個二維矩陣來記錄中間的結果。這個二維矩陣怎麼構造呢?直接舉個例子吧 bab 和 caba 當然我們現在一眼就可以看出來最長公...

最長公共子串 最長公共子串行

子串要求連續 子串行不要求連續 之前的做法是dp求子序列 include include include using namespace std const int inf 0x3f3f3f3f const int mod 1000000007 string s1,s2 int dp 1010 10...