題目描述:給定乙個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
int
lcs(
char
query,
char
text)
else
c[j] = 0;
if
(c[j] > len)
len=c[j];
}
}
return
len;
}
int
main()
文章**
求最長公共子串
參考 最長公共子串 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 ...