Java函数:如何找到字符串中最长的联续子序列?
问题描述
给定一个字符串s,找到其最长的连续子序列,使得子序列中的所有字符均相同。例如,对于字符串s="abcaaaaaadefggh",其最长的连续子序列是"aaaaaa"。
解题方法
该问题可以通过遍历字符串s,并利用两个指针i和j记录当前最长连续子序列的起始和结束位置来解决。具体思路如下:
1. 初始化指针i和j为0,maxlen为0
2. 遍历字符串s,记录当前字符ch以及其连续出现的次数count
3. 如果当前字符ch与前面遍历的字符不同,则更新指针i为当前位置,同时将count重置为1
4. 如果当前字符ch与前面的字符相同,更新指针j为当前位置,更新maxlen为当前最长连续子序列的长度
5. 最后返回最长连续子序列的起始位置i以及其长度maxlen即可
Java代码演示
public class LongestSubstring {
public static void main(String[] args) {
String s = "abcaaaaaadefgggh";
int i = 0, j = 0;
int maxlen = 0;
int n = s.length();
for (int k = 1; k < n; k++) {
if (s.charAt(k) != s.charAt(k - 1)) {
if (maxlen < k - i) {
maxlen = k - i;
j = k - 1;
}
i = k;
}
}
if (maxlen < n - i) {
maxlen = n - i;
j = n - 1;
}
System.out.println("Longest substring: " + s.substring(i, j + 1));
System.out.println("Length: " + maxlen);
}
}
该代码先遍历字符串s,将当前字符ch以及其连续出现的次数count记录下来。如果遇到一个新的字符,就更新指针i为当前位置,同时将count重置为1。如果遇到一个和前面字符相同的字符,就更新指针j为当前位置,更新maxlen为当前最长连续子序列的长度。最后返回最长连续子序列的起始位置i以及其长度maxlen即可。
代码输出结果为:
Longest substring: aaaaaa
Length: 6
总结
以上就是寻找字符串中最长的联续子序列的Java代码实现方法。该方法的时间复杂度为O(n),因为只需要遍历一次字符串s即可找到最长连续子序列。对于需要频繁处理此类问题的程序员来说,这种方法可以提高代码的效率。
