首页 > 解决方案 > 使字符重复序列计数方法更快

问题描述

我目前正在为 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;
}

标签: java

解决方案


我想出了一些方法来提高性能(并且还在您的代码中发现了一个错误)。

一个错误

您有以下代码:

if (c == currentRepeatingCharacter) {
    biggestRepeatingCount++;
} else {
    if (totalRepeatingCharacters < biggestRepeatingCount) {
        totalRepeatingCharacters = biggestRepeatingCount;
    }
    biggestRepeatingCount = 0;
}

但是,只有在看到不等于 的字符时才会设置totalRepeatingCharacters,这成为一个问题:currentRepeatingCharacter

    String string =
            "aaaaaaaaaaaaaaaaaaaaaaasidhihasdbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";

它找到与24String长度相同的长度"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比现在更大了。


推荐阅读