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字符转实体:深入解析与最佳实践

下一篇:Java字符编码与Unicode:探秘“极乐净土”字符