最長公共子串,字串

2021-07-29 09:57:56 字數 1185 閱讀 8465

目前,在各大**或者是,有著不少的關於這個問題的講解,但是目前覺得都不是很清晰明白!現在普遍的解法都是用動態規劃的方式來做這道筆試題。或者是經典的面試題。

這裡我做乙個自認為比較清楚的講解。說到動態規劃很多人都不會感到很陌生。但是有多少知道動態規劃什麼?精髓在**? 這裡僅僅提供一些個人見解,首先,動態規劃不是一種解題的方式,它只是一種以空間換時間的優化方式,同時可能會對**有乙個比較好的優化方式。也就是說它並不是一種演算法。如果有人告訴你這個題用動態規劃去做,請抽他,因為他這樣說等於啥都沒有說!

動態規劃的精髓在於狀態轉移方程。我們首先應該找出最簡單的一種情況,然後再去找到 從乙個狀態轉移到另外乙個狀態的對應關係。可能還是有很多人不知道這是什麼意思。

舉個簡單的例子,從數字5到數字6需要加一。很好理解吧!

現在我們來看這個題。首先,這個題和最長公共子串行是不一樣的。就是最長公共子串行是可以不連續的,但是最長公共字串必須是連續的。

假設需要求的字串為 str1 , str2 .函式 f(m,n) 求分別以str1[m] , str2[n] 結尾的公共字串長度。

首先,我們應該考慮 f(m,n),在二維陣列的(m,n)出代表的意義,這樣才可以更好的找出狀態轉移方程!這裡該位置代表著一 str1[m],str2[n]結尾的公共字串的長度是多少。然後我們考慮當前m,n位置處,如果str1[m]==str2[n],那麼公共字串,長度肯定就等於str1[m-1],str2[n-1] + 1,因為前面如果是字串就加1,如果不是就正常m,n處是開頭也是結尾,然後如果str1[m]!=str2[n],就說明如果加上最後乙個m,n處就 不是公共字串了,所以這裡是0,

最後就有了狀態轉移方程! if(str1[m] == str2[n]) else

剩下的就是**了!

#include#includeusing namespace std;  

int c[10000][10000];

char str1[10000];

char str2[10000];

void func(int m,int n) //查詢最長子字串

cout<>str1;

cin>>str2;

m=strlen(str1);

n=strlen(str2);

func(m,n);

return 0;

}

最長公共子字串

關於題目理解,請注意和最長公共子串行的區別,最長公共子字串的解法是動態規劃,但是比較難想到表的構造方法。注意到,設給定字串為str1 和 str2 二者的長度分別是 len1 和 len2 那麼解空間大小之多是len1 len2?假設最長公共子字串為substr common,那麼substr co...

最長公共子字串

描述 求兩個輸入序列的最長的公共子字串的長度。子字串中的所有字元在源字串中必須相鄰。如字串 21232523311324和字串312123223445,他們的最長公共子字串為21232,長度為5。輸入格式 兩行,第一行為第乙個字串x,第二行為第二個字串y,字串不含空格並以回車標示結束。x和y的串長都...

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

例 bdcaba和abcbdab,最長公共子串行為 bcba。dp解法 字串1的長度為length1,字串2的長度為length2,建立乙個二維陣列c length1 length2 用來記錄最長公共子串行的長度,狀態轉移方程為 整個狀態轉移以及二維陣列矩陣c為 生成字串長度加1的0矩陣,m用來儲存...