求兩個字串的最長公共子串(初學者適用)

2021-10-05 17:18:09 字數 1134 閱讀 6791

即兩個字串中相等且連續的子串。

例如:串「abcde」和串「gabfcde」中公共子串有ab」和「cde」兩個。

即在上述「公共子串」的定義中加上最長二字, 上面例子中「cde」便是最長公共子串

大致思路

假設有串str1和串str2。挨個找出str1和str2中所有的公共子串,在尋找過程中只記錄下長度最長的公共子串。

先固定其中乙個字串(此處將str1固定),取其第乙個字元str1[0],查詢str1和str2中有沒有以該字元開頭的公共子串:

將str[0]與str2中的字元挨個比較,若遇到相等的,再接著比較str1和str2中相等字元的下乙個位置,直至遇到下一對不相等的字元,即完成乙個公共子串的搜尋。例如:

若該公共子串的長度大於之前搜尋到的公共子串長度,則將原有的覆蓋掉(始終保留長度最大的公共子串),之後繼續查詢,將str1[0]與str2中的剩餘字元逐一比較。

之後再依次取出str1中的第2個、第3個…第n個字元,重複上述操作,當str1中的所有字元均取出和str2中的字元遍歷比較後,此時所記錄下來的公共子串即為所求的最長公共子串。

這是我個人的思想,可能理解起來有點麻煩,但還是想把它記錄下來

`#include#includetypedef struct //設定乙個棧來記錄下每次找到的公共子串

stack;

void init(stack &s)//在查詢完乙個公共子串後,需要將棧初始化,以存放下乙個公共子串的資訊

char s[100]=;//存放最長公共子串

void find(stack s1,char *str1,char *str2)

if(strlen(s1.str))//如果前面存在公共子串,說明k已經不是str1中取出的第i個字元了,在進行下一次比較前,需將其置為i

k=i;

else //否則就一直挨個與str2中的字元進行比較

++j;

}} }

}int main()

求兩個字串的最長公共子串

問題 有兩個字串str和str2,求出兩個字串中最長公共子串長度。比如 str acbcbcef,str2 abcbced,則str和str2的最長公共子串為bcbce,最長公共子串長度為5。演算法思路 1 把兩個字串分別以行和列組成乙個二維矩陣。2 比較二維矩陣中每個點對應行列字元中否相等,相等的...

求兩個字串的最長公共子串

def longestcommonsequence str one,str two,case sensitive true str one 和 str two 的最長公共子串行 param str one 字串1 param str two 字串2 正確結果 param case sensitive...

求兩個字串的最長公共子串

採用乙個二維矩陣來記錄中間結果,矩陣的橫座標為字串1的各個字元,矩陣的縱座標為字串2的各個字元。舉例說明 假設兩個字串分別為 bab 和 caba 當然我們現在一眼就可以看出來最長公共子串是 ba 或 ab b a b c 0 0 0 a 0 1 0 b 1 0 1 a 0 1 0 可以看出,矩陣的...