Java中查找连续重复字符的多种高效方法217
在Java编程中,经常会遇到需要查找字符串中连续重复字符的情况。例如,在数据校验、文本处理或密码安全检查等场景中,识别连续重复字符至关重要。本文将深入探讨几种高效的Java方法来查找连续重复字符,并分析其时间复杂度和适用场景,帮助开发者选择最佳方案。
方法一:循环迭代法 (Naive Approach)
最直接的方法是使用循环迭代字符串,逐个字符比较。这种方法简单易懂,但效率相对较低,尤其是在处理长字符串时。代码如下:```java
public static int findLongestConsecutiveRepeatingChar(String str) {
if (str == null || ()) {
return 0;
}
int maxCount = 1;
int currentCount = 1;
char currentChar = (0);
for (int i = 1; i < (); i++) {
if ((i) == currentChar) {
currentCount++;
} else {
maxCount = (maxCount, currentCount);
currentCount = 1;
currentChar = (i);
}
}
maxCount = (maxCount, currentCount); // 处理最后一个字符序列
return maxCount;
}
public static void main(String[] args) {
String str1 = "aabbbcccdde";
String str2 = "aaabbbbccccddddd";
String str3 = "abcdefg";
String str4 = "";
String str5 = null;
("Longest consecutive repeating char in '" + str1 + "': " + findLongestConsecutiveRepeatingChar(str1)); // Output: 3
("Longest consecutive repeating char in '" + str2 + "': " + findLongestConsecutiveRepeatingChar(str2)); // Output: 5
("Longest consecutive repeating char in '" + str3 + "': " + findLongestConsecutiveRepeatingChar(str3)); // Output: 1
("Longest consecutive repeating char in '" + str4 + "': " + findLongestConsecutiveRepeatingChar(str4)); // Output: 0
("Longest consecutive repeating char in '" + str5 + "': " + findLongestConsecutiveRepeatingChar(str5)); // Output: 0
}
```
该方法的时间复杂度为O(n),其中n为字符串的长度。空间复杂度为O(1)。
方法二:正则表达式法
Java的正则表达式提供了一种强大的字符串匹配工具。我们可以使用正则表达式来查找连续重复的字符。这种方法简洁明了,但需要理解正则表达式的语法。```java
public static int findLongestConsecutiveRepeatingCharRegex(String str) {
if (str == null || ()) {
return 0;
}
Matcher matcher = ("(.)\\1*").matcher(str);
int maxLen = 0;
while (()) {
maxLen = (maxLen, ().length());
}
return maxLen;
}
public static void main(String[] args) {
String str1 = "aabbbcccdde";
String str2 = "aaabbbbccccddddd";
String str3 = "abcdefg";
("Longest consecutive repeating char in '" + str1 + "': " + findLongestConsecutiveRepeatingCharRegex(str1)); // Output: 3
("Longest consecutive repeating char in '" + str2 + "': " + findLongestConsecutiveRepeatingCharRegex(str2)); // Output: 5
("Longest consecutive repeating char in '" + str3 + "': " + findLongestConsecutiveRepeatingCharRegex(str3)); // Output: 1
}
```
`(.)\\1*` 这个正则表达式匹配一个字符(.)及其后面的零个或多个相同的字符(\1*)。 `().length()` 返回匹配到的字符串长度。 时间复杂度取决于正则表达式的匹配效率,通常也接近O(n)。
方法三:使用Stream API (Java 8+)
Java 8 引入的 Stream API 提供了一种函数式编程风格,可以更简洁地处理集合数据。我们可以使用 Stream API 来实现连续重复字符的查找。```java
public static int findLongestConsecutiveRepeatingCharStream(String str) {
if (str == null || ()) {
return 0;
}
return ()
.mapToObj(c -> (char) c)
.collect(((), ()))
.entrySet().stream()
.mapToInt(entry -> ().intValue())
.max().orElse(1);
}
public static void main(String[] args) {
String str1 = "aabbbcccdde";
String str2 = "aaabbbbccccddddd";
String str3 = "abcdefg";
("Longest consecutive repeating char in '" + str1 + "': " + findLongestConsecutiveRepeatingCharStream(str1)); // Output: 3
("Longest consecutive repeating char in '" + str2 + "': " + findLongestConsecutiveRepeatingCharStream(str2)); // Output: 5
("Longest consecutive repeating char in '" + str3 + "': " + findLongestConsecutiveRepeatingCharStream(str3)); // Output: 1
}
```
这段代码利用 `` 将字符分组并计数,然后找到最大计数。 虽然代码简洁,但其时间复杂度也为O(n),空间复杂度则略高于其他方法,因为它需要额外的空间来存储字符计数。
总结
本文介绍了三种查找Java字符串中连续重复字符的方法:循环迭代法、正则表达式法和Stream API法。循环迭代法简单易懂,适合对效率要求不高的情况;正则表达式法简洁优雅,但需要一定的正则表达式知识;Stream API法利用Java 8的新特性,代码更简洁,但空间复杂度略高。选择哪种方法取决于具体的需求和对代码可读性、性能的要求。 在大多数情况下,循环迭代法和正则表达式法的效率差别不大,可以根据个人偏好选择。
需要注意的是,以上方法都只查找连续重复字符的最大长度。如果需要找到所有连续重复字符及其位置,则需要修改代码逻辑,例如使用List来存储结果。
2025-05-16

Java数据控件:深入探讨Swing、JavaFX及第三方库
https://www.shuihudhg.cn/107253.html

PHP时间函数详解:从基础到高级应用
https://www.shuihudhg.cn/107252.html

C语言换行符详解:printf、putchar及其他换行方法
https://www.shuihudhg.cn/107251.html

PHP高效获取并处理远程公告:最佳实践与技巧
https://www.shuihudhg.cn/107250.html

Java字节数组转字符串:深入解析编码与解码
https://www.shuihudhg.cn/107249.html
热门文章

Java中数组赋值的全面指南
https://www.shuihudhg.cn/207.html

JavaScript 与 Java:二者有何异同?
https://www.shuihudhg.cn/6764.html

判断 Java 字符串中是否包含特定子字符串
https://www.shuihudhg.cn/3551.html

Java 字符串的切割:分而治之
https://www.shuihudhg.cn/6220.html

Java 输入代码:全面指南
https://www.shuihudhg.cn/1064.html