牛客刷題 最長公共子串

2021-10-21 01:13:23 字數 1070 閱讀 5394

題目:給定兩個字串str1和str2,輸出兩個字串的最長公共子串,如果最長公共子串為空,輸出-1。

輸入:"1ab2345cd","12345ef" 

輸出:"2345"

看完題目想到了用動歸,剛開始分析的時候想著,對於每兩個元素的比較,有兩種情況,1.元素相同,那麼當前元素能夠成的最長公共子串的長度為上乙個的+1;2.元素不相同,那麼構成的最長公共子串長度為0。但是沒有考慮清楚,對於情況1 的上乙個元素是什麼樣的,動歸計算出來的是乙個序列還是乙個二維矩陣。。。。總之也算是有點進步了,嗯。

在進行最長公共子串判斷的時候,由於兩個子串中的任何位置都可能存在匹配,因此需要使用兩層迴圈進行遍歷,計算出動歸矩陣。對於當前位置 [i,j],如果兩個子串中 i 和 j 位置的元素對應相等,那麼構成一位的公共子串,此時就需要去看看兩個子串的對應上個元素是不是相等的,對於 i ,其前面乙個元素是 i-1,對於 j ,前面乙個元素是 j-1,所以 [i,j] 的值應該為 1+[i-1,j-1],如果當前元素不匹配的話,那麼[i,j]直接置為0即可。

在進行計算矩陣的時候,由於字串的第乙個元素沒有前置元素,因此可以新增一零行和 一零列來保證第乙個元素也有前置狀態可循。並且在計算矩陣的過程中,每次遇到對應元素匹配的時候,更新當前的最大長度max和最大長度對應的下標maxindex,在後面獲取最長子串的時候可以直接使用substring函式,根據最大長度和最大的下標確定起始點maxindex-max+1,確定結束點maxindex+1進行擷取即可。

完整**如下:

public static string lcs (string str1, string str2) 

int len1 = str1.length()+1;

int len2 = str2.length()+1;

int res = new int[len1][len2];

int max = 0;

int maxindex = 0;

for(int k=0;kmax)

}else

}} if(max==0)else

}

牛客題霸 最長公共子串

題目描述 給定兩個字串str1和str2,輸出兩個字串的最長公共子串,如果最長公共子串為空,輸出 1。示例1輸入 1ab2345cd 12345ef 返回值 2345 python longest common substring param str1 string字串 the string par...

牛客網 最長公共子串行

我們有兩個字串m和n,如果它們的子串a和b內容相同,則稱a和b是m和n的公共子串行。子串中的字元不一定在原字串中連續。例如字串 abcfbc 和 abfcab 其中 abc 同時出現在兩個字串中,因此 abc 是它們的公共子串行。此外,ab af 等都是它們的字串。現在給你兩個任意字串 不包含空格 ...

牛客題霸 研發 NC127 最長公共子串

本題鏈結 給定兩個字串str1和str2,輸出兩個字串的最長公共子串,如果最長公共子串為空,輸出 1。輸入 1ab2345cd 12345ef 返回值 2345 動態規劃問題 假設兩個字串長度為n m,具體分析其問題 最優子結構 如果知道 n 1 m 1 長度字串的最長公共子串s,則 n m 長度字...