最长公共子串 | 阿里2015笔试附加题2
来源:互联网 发布:mac网页视频怎么全屏 编辑:程序博客网 时间:2024/06/10 01:16
题目:给定一个query和一个text,均由小写字母组成。要求在text中找出以同样的顺序连续出现在query中的最长连续字母序列的长度。例如,query为“acbac”,text为“acaccbabb”,那么text中的“cba”为最长的连续出现在query中的字母序列,因此,返回结果应该为其长度3。请注意程序效率。
【思路】
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
如上图所示,我们可以用一个二维数组arr记录公共序列的长度,若 query.charAt(j) = text.charAt(i),那么 arr[i][j] = arr[i - 1][j - 1] + 1,并记录最大长度 maxLen,然后返回 maxLen。这是一种思路,另外,我们发现这里可以用一维数组arr来记录最大长度,一旦发现 query.charAt(j) = text.charAt(i),那么 arr[i] = arr[i - 1] + 1(当 i = 1或 j = 1 时,arr[i] = 1)。否则,arr[i] = 0:
public class QueryLen { public int findMaxLen(String query, String text) { int maxLen = 0; int[] arr = new int[text.length()]; for (int i = 0; i < query.length(); i++) for (int j = text.length() - 1; j >= 0; j--) { //注意要逆序遍历,否则,在字符不相等时可能会把前面元素的记录清除 if (query.charAt(i) == text.charAt(j)) if (i == 0 || j == 0) arr[j] = 1; else arr[j] = arr[j - 1] + 1; else arr[j] = 0; maxLen = Math.max(maxLen, arr[j]); } return maxLen; } public static void main(String[] args) { int len = new QueryLen().findMaxLen("acbac", "acaccbabb"); System.out.println(len); len = new QueryLen().findMaxLen("aabbaabbccddddccbb","fabbaexf"); System.out.println(len); }}结果:
34
- 最长公共子串 | 阿里2015笔试附加题2
- 阿里笔试之最长公共子串
- 阿里笔试之最长公共子串
- 阿里笔试之最长公共子串
- 阿里2015 研发笔试 求最长公共子串
- [笔试]阿里笔试-最长公共连续子序列
- 求两个字符串的最长公共子序列 阿里在线笔试题
- 谷歌笔试题(最长公共子串)
- 经典笔试题 最长公共子串(连续)问题
- 2015阿里在线笔试题求两个字符串的最长子串
- 【笔试】求 最长公共子序列 和 最长公共子串的长度
- 阿里面试题—最长公共子串算法
- 最长公共子串的长度(阿里)
- 公司笔试题——最长公共子序列
- 最长公共子串
- 最长公共子串
- 最长公共子串
- 最长公共子串
- 安装Windows 2012域控(For SQLServer 2014 AlwaysOn)
- maven build 报错
- 魅族便签,能否成为国内便签应用的No.1?
- 不支持默认int
- 学习笔记之深入浅出MFC 第5章 Windows程序的生与死
- 最长公共子串 | 阿里2015笔试附加题2
- Linux ping
- terminate called after throwing an instance of 'std::bad_alloc
- The C programing language chapter 6 : struct
- 欢迎使用CSDN-markdown编辑器
- 清除浮动的七种方式方法(实例代码讲解)
- BZOJ2904: 平方和
- 网页点击按钮返回顶部代码
- 【关键字private,static,final】