最长公共子串 | 阿里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       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


1 0
原创粉丝点击