java - 使字符重复序列计数方法更快
问题描述
我目前正在为 Twitch 聊天机器人开发一个审核系统,我使用这种方法来查找重复字符的最长序列,问题是我不知道哪个字符或它将在哪里重复,因为将使用此方法检查随机消息。谁能帮我简化并使下面的代码更永久?
public int getLongestLetterSequence(String message) {
int biggestRepeatingCount = 0;
int totalRepeatingCharacters = 0;
char currentRepeatingCharacter = message.charAt(0);
for (int i = 0; i < message.length(); i++) {
char c = message.charAt(i);
if (Character.isLetterOrDigit(c)) {
if (c == currentRepeatingCharacter) {
biggestRepeatingCount++;
} else {
if (totalRepeatingCharacters < biggestRepeatingCount) {
totalRepeatingCharacters = biggestRepeatingCount;
}
biggestRepeatingCount = 0;
}
}
currentRepeatingCharacter = c;
}
return totalRepeatingCharacters + 1;
}
解决方案
我想出了一些方法来提高性能(并且还在您的代码中发现了一个错误)。
一个错误
您有以下代码:
if (c == currentRepeatingCharacter) {
biggestRepeatingCount++;
} else {
if (totalRepeatingCharacters < biggestRepeatingCount) {
totalRepeatingCharacters = biggestRepeatingCount;
}
biggestRepeatingCount = 0;
}
但是,只有在看到不等于 的字符时才会设置totalRepeatingCharacters
,这会成为一个问题:currentRepeatingCharacter
String string =
"aaaaaaaaaaaaaaaaaaaaaaasidhihasdbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";
它找到与24
的String
长度相同的长度"aaaaaaaaaaaaaaaaaaaaaaa".length() + 1
。如前所述,数字仅在找到另一个字符后更新,即使b
字符数量更大,它也不会跟随另一个字符,因此未注册。
修复
将if
语句移动到另一个位置,如下所示:
if (c == currentRepeatingCharacter) {
biggestRepeatingCount++;
if (totalRepeatingCharacters < biggestRepeatingCount) {
totalRepeatingCharacters = biggestRepeatingCount;
}
} else {
biggestRepeatingCount = 0;
}
性能改进
当您遍历时,String
您最终可以停止,因为留在的字符数量String
小于totalRepeatingCharacters
,因此totalRepeatingCharacters
永远不会增加(最大值已经找到)
if (c == currentRepeatingCharacter) {
biggestRepeatingCount++;
if (totalRepeatingCharacters < biggestRepeatingCount) {
totalRepeatingCharacters = biggestRepeatingCount;
}
} else {
if(string.length() - i <= maxRepeatingCount + 1) {
if (totalRepeatingCharacters < biggestRepeatingCount) {
totalRepeatingCharacters = biggestRepeatingCount;
}
break;
}
biggestRepeatingCount = 0;
}
我们只在切换到新角色时检查是否是这种情况。对于某些String
代码,现在的执行时间会更短:
String string =
"aaaaaaaaaaaaaaaaaaaaaaasidhxhazdbbbbbbbbbbbbbbbbbbbb";
当它进入角色h
时,它将break
脱离for
循环,因为没有办法totalRepeatingCharacters
比现在更大了。