演算法 最長公共子串行

2021-07-11 23:00:39 字數 2218 閱讀 8588

好久沒做演算法題了,現在發現自己的演算法能力非常薄弱,所以特意練練,順便做個筆記方便以後檢視。

今天整理一下最長公共子串行,最長公共子串行的問題常用於解決字串的相似度,是乙個非常實用的演算法,作為碼農,此演算法是我們的必備基本功。

最長公共子串行,是指兩個字串可具有的長度最大的公共的子串行。聽著好像有點繞口,舉個例子吧:

上面標紅的就是最長公共子串行,是不是一看就明白了。

仔細想想我們可以發現其實最長公共子串行的個數不是唯一的,可能會有兩個以上,但是長度一定是唯一的,比如這裡的最長公共子串行的長度為4。

求最長公共子串行長度有三種方法

1)列舉法:

這種方法是最容易想到的,可是這種方法是非常笨得,他的效率很低。我們可以分析一下:

拿上面的android字串來講,長度為七,那麼他一共有2的7次方個子串,

每個子串行要在第二個長度為n的字串中去匹配,匹配一次

需要o(n)的時間,

要是乙個乙個列舉的話時間複雜度為指數級,這小的效率慢的和烏龜沒啥區別了,當然這也是沒辦法的辦法。

2)遞迴方法

遞迴演算法

是一種直接或者間接呼叫自身函式或者方法的演算法。

遞迴演算法的實質是把問題分解成規模縮小的同類問題的子問題,然後遞迴呼叫方法來表示問題的解。遞迴演算法對解決一大類問題很有效,它可以使演算法簡潔和易於理解。

下面就是遞推公式。

當陣列a和b對應位置字元相同時,則直接求解下乙個位置;當不同時取兩種情況中的較大數值。

**如下:

public class main ;

static char str2 = ;

public static void main(string args)

static int lcs(int i,int j)

}

遞迴演算法的**一般看著都很簡潔,我們很容易理解裡面的思想,可是用遞迴演算法一般會存在一些缺點的,缺點是效率不高,有大量的重複執行遞迴呼叫,而且只能求出最大公共子串行的長度,求不出具體的最大公共子串行。

3)動態規劃求解

動態規劃演算法通常基於乙個遞推公式及乙個或多個遞推狀態,當前子問題的解決由上乙個子問題推導出。使用動態規劃來解決問題只需要多項式時間複雜度,因此比回溯、列舉、暴力的解決方法要快很多。

動態規劃採用二維陣列來標識中間計算結果,避免重複的計算來提高效率。

最長公共子串行的長度的動態規劃方程

**如下:

public class main ;

static char str2 = ;

static int num = new int[str1.length+1][str2.length+1];

public static void main(string args)

static void lcs()

else }}

}}

圖大家可以自己根據**畫一畫這個二維陣列的過程圖,**完全是根據上面的公式照搬過來的

整個計算過程如下面這個矩陣所示:

要想得到最長公共子串行,我們可以注意標紅的區域,所對應的字元就是我們所需要的,我們只西藥把他們取出來就ok了,詳細**就不寫了。

前幾天看來一道演算法題,題目大概是這樣的:回文串是指正反都相同的字串,比如abba,他正著看反著看都相同,給你乙個字串,長度小於1000,讓你刪除最少的字元使得該字串成為回文串,例子:agddgca,刪除字元c就可以組成乙個回文串。問最少刪除幾個字元?

剛拿到該題一時還沒想出解題方法來,之後才想到可以借助最長公共子串行來解決,我們那上面那個例子看一下,我們把這個字元轉倒序:acgddga,可以看到他們的最長公共子串行剛好是最長回文串,這是不是巧合呢?當然不是了,我們還可以多舉幾個例子,結果都是一樣的。其實倒過來的字串和原來的字串比較,就是那前面的跟後面的字串比較,如果一樣,那麼他們當然是回文了。

所以求解這道題就比較簡單了:

1)先將字串倒序排列

2)求兩個字串飛串的最長公共子串行

3)用字串的長度減去最長公共子串行就得到結果

演算法 最長公共子串行

題目 給定兩個字串 text1 和 text2,返回這兩個字串的最長公共子串行的長度。乙個字串的 子串行 是指這樣乙個新的字串 它是由原字串在不改變字元的相對順序的情況下刪除某些字元 也可以不刪除任何字元 後組成的新字串。例如,ace 是 abcde 的子串行,但 aec 不是 abcde 的子串行...

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

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 當然我們現在一眼就可以看出來最長公...