最长公共子串 | 阿里2015笔试附加题2

该博客探讨了如何在给定的query和text字符串中找到最长的连续子序列,该子序列按顺序出现在query中。通过示例解释了算法思路,包括使用二维和一维数组来记录公共序列长度,以提高程序效率。最后,提出了优化方法,当字符匹配时更新一维数组arr的值,从而得到最长公共子串的长度。
摘要由CSDN通过智能技术生成

题目:给定一个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);
    }
}
结果:

3
4


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值