找最長公共子串

2021-09-01 13:29:09 字數 1057 閱讀 9581

小明有兩個字串(可能包含空格),小明想找出其中最長的公共連續子串,希望你能幫助他,並輸出其長度。

輸入描述:輸入為兩行字串(可能包含空格),長度均小於等於50。

輸出描述:輸出為乙個整數,表示最長公共連續子串的長度。

示例1輸入:

abcde

abgde

輸出:2

1、先判斷哪個字串比較短,因為公共子串的長度不會超過短字串的長度。

2、設定左右指標,指標的距離為短字串的長度。檢視長字串是否包含短字串該長度的子串。

若包含,則該子串為最長串,可直接返回其長度。若不包含,則長度遞減,繼續遍歷短字串中所有該長度的子串。

一直遍歷到長度為0為止.

public

intmaxsubstringlength1

(string a, string b)

//直接遍歷短的字串查詢

int shortlength = shortstring.

length()

;for

(int i =

0; i < shortlength; i++)}

}return0;

}

使用動態規劃的思想,定義二維陣列dp。dp[i][j]表示a串前i個和b串前j個的最長公共子串的長度。

使用max記錄當前的最長公共子串的長度。

如果a的首字元和b的首字元相等,那麼dp[0][0]初始化為1,否則dp[0][0]為0。

在i與j不同時為0的情況下,如果a的第i個字元與b的第j個字元相等,那麼dp[i][j] = dp[i-1][j-1] + 1,

並且判斷max與dp[i][j]的大小以更新max。最終返回max

public

intmaxsubstringlength2

(string a, string b)

else

//發現更長的子串,則更新max

if(max < dp[i]

[j])}}

}return max;

}

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

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...