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