阿里笔试之最长公共子串
来源:互联网 发布:知之深,爱之切 编辑:程序博客网 时间:2024/04/29 16:28
题目描述:给定一个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;
}
0 0
- 阿里笔试之最长公共子串
- 阿里笔试之最长公共子串
- 阿里笔试之最长公共子串
- 阿里2015 研发笔试 求最长公共子串
- 最长公共子串 | 阿里2015笔试附加题2
- [笔试]阿里笔试-最长公共连续子序列
- 【笔试】求 最长公共子序列 和 最长公共子串的长度
- 阿里面试题—最长公共子串算法
- 最长公共子串的长度(阿里)
- 求两个字符串的最长公共子序列 阿里在线笔试题
- poj2774之最长公共子串
- ural1517之最长公共子串
- LCS之最长公共子串
- 算法学习之最长公共子串
- lintcode 之 最长公共子串
- 动态规划之最长公共子串
- 动态规划之最长公共子串
- 谷歌笔试题(最长公共子串)
- 动态规划趣味入门
- 2.30
- After Installation of Ubuntu
- P78,5-8作业题
- linux定时器的实现
- 阿里笔试之最长公共子串
- 计算机网络之概述
- 2015-第4周项目3-用对象数组操作长方柱类
- 【leetcode】Unique Paths
- 正则表达式的贪婪与懒惰模式
- 菜单
- hdu1024 Max Sum Plus Plus(动态规划)
- Word Search
- leetCode 190-Reverse Bits