求最长公共子串
来源:互联网 发布:裁剪照片的软件 编辑:程序博客网 时间:2024/05/16 15:20
题目描述:给定一个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 <cstring>
#include <cstdio>
#define M 1010
int
LCS(
char
query[],
char
text[])
{
int
len_query=
strlen
(query),len_text=
strlen
(text);
//数组c记录匹配情况,模拟二维矩阵
char
c[len_text];
int
len, i, j;
len=0;
for
(i=0; i<len_query; i++)
{
//不反过来会把之前数组元素冲掉的,因为后面的元素需要根据前面的元素计算
for
(j=len_text-1; j>=0; j--)
{
if
(query[i] == text[j])
{
if
(i==0 || j==0)
c[j]=1;
else
c[j]=c[j-1]+1;
}
else
c[j] = 0;
if
(c[j] > len)
len=c[j];
}
}
return
len;
}
int
main()
{
char
str1[M],str2[M];
printf
(
"请输入字符串query:"
);
scanf
(
"%s"
, str1);
printf
(
"请输入字符串text:"
);
scanf
(
"%s"
, str2);
printf
(
"所求长度为:"
);
printf
(
"%d\n"
,LCS(str1,str2));
return
0;
}
文章转自http://my.oschina.net/gaosheng/blog/308853
0 0
- 求最长公共子串
- 求最长公共子串
- 求最长公共子串
- 求最长公共子串
- 求最长公共子串
- 求最长公共子串
- 求最长公共子串
- 求最长公共子串(串)
- LCS算法求最长公共子串
- 求最长公共子串问题
- LCS算法求最长公共子串
- 求两个字符串最长公共子串
- 求最长连续公共子串
- 【动态规划】求最长公共子串
- lintcode 求最长公共子串
- 动态规划求最长公共子串
- LCS求最长公共子串
- 求最长公共子序列
- 获取 当前时间的字符串 asctime localtime time
- 【OpenMesh】一些基本操作:翻转和折叠
- expressjs运行原理
- 软件评价了解
- ios 动态添加了按钮,绑定同一个点击事件,如何判断点击的是哪个?
- 求最长公共子串
- leetcode第9题-Palindrom Number
- 线段树 杭电 1166(入门)
- Objective-C语法快速参考
- iOS 代理的传值使用
- IOS 中的 CoreData的使用
- iOS 中tableview的使用
- 欢迎使用CSDN-markdown编辑器
- B - Ignatius and the Princess IV (DP+模拟)