求最長公共子串

2021-06-29 10:24:13 字數 2264 閱讀 9086

題目描述:給定乙個query和乙個text,均由小寫字母組成。要求在text中找出以同樣的順序連續出現在query中的最長連續字母序列的長度。例如,query為「acbac」,text為「acaccbabb」,那麼text中的「cba」為最長的連續出現在query中的字母序列,因此,返回結果應該為其長度3。請注意程式效率。

思路:用乙個矩陣來記錄兩個字串中所有位置的兩個字元之間的匹配情況,若是匹配則為1,否則為0。然後求出對角線最長的1序列,其對應的位置就是最長匹配子串的位置.

當字元匹配的時候,不是簡單的給相應元素賦上1,而是賦上其左上角元素的值加1。我們用兩個標記變數來標記矩陣中值最大的元素的位置,在矩陣生成的過程中來判斷

當前生成的元素的值是不是最大的,據此來改變標記變數的值,那麼到矩陣完成的時

候,最長匹配子串的位置和長度就已經出來了。

例項如下:

a    c    b    a    c

a   1    0    0    1    0   

c   0    2    0    0    2

a   1    0    0    1    0

c   0    2    0    0    2

c   0    1    0    0    1

b   0    0   2    0    0

a   1    0    0   3    0    

b   0    0    1    0    0

b   0    0    1    0    0

(紅色為最長公共子串)?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

#include

#include

#define m 1010

intlcs(charquery,chartext)

else

c[j] = 0;

if(c[j] > len)

len=c[j];

}

}

returnlen;

}

intmain()

文章**

求最長公共子串

參考 最長公共子串 longest common substirng 和最長公共子串行 longest common subsequence,lcs 的區別為 子串是串的乙個連續的部分,子串行則是從不改變序列的順序,而從序列中去掉任意的元素而獲得新的序列 也就是說,子串中字元的位置必須是連續的,子串...

求最長公共子串行和最長公共子串

輸入描述 輸入為兩行字串 可能包含空格 長度均小於等於50。輸出描述 輸出為乙個整數,表示最長公共連續子串的長度。輸入例子 abcde abgde 輸出例子 2題解 例如 str1 abcde str2 abgde matrix 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0...

LCS求最長公共子串

問題描述 給兩個子串行a和b,求長度最長的公共子串行,如1,5,2,6,8,7和2,3,5,6,9,8,4的最長公共子串行為5,6,8另乙個解為2,6,8求出這樣的子串行最長是多少?狀態轉移方程 對a1,a2 ai和b1,b2,bj 當a i b j 時,d i,j d i 1,j 1 1 否則d ...