You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复CodeSignal中classifyStrings代码的全部测试用例?

Classifying Strings as Good/Bad/Mixed: Fixing Your Code

Let's start by breaking down the critical flaws in your current code, then walk through a corrected approach that handles all the edge cases you mentioned (like ? between vowels, consonants split by vowels, etc.).

Key Issues in Your Original Code

  1. Broken vowel check: The condition if i == "a" or "e" or "i" or "o" or "u" doesn't work—Python evaluates "e" as a boolean True, so every character gets counted as a vowel. You need to check if the character is in a set of vowels instead.
  2. Premature returns: You return "bad" or "good" on the first iteration of the loop, meaning you never check the rest of the string. This is why most test cases fail.
  3. Incorrect ? handling: Your code tries to check if i in l == "?" (invalid syntax) and immediately returns "mixed" at the first ?. But a string with ? is only mixed if there's a way to replace it to make the string good AND a way to make it bad—not just because it contains a ?.

Correct Approach

We need to track all possible consecutive vowel/consonant streaks as we iterate through the string, since ? can be either a vowel or consonant. For each character, we'll maintain sets of possible streak lengths for vowels and consonants, then check if any of these streaks cross the "bad" thresholds (3+ vowels, 5+ consonants).

Here's the core logic:

  • For each character, update the possible streaks based on whether it's a vowel, consonant, or ?.
  • After each update, check if any streak is bad (to mark that a bad path exists) and if any streak is still good (to mark that a valid good path exists).
  • If all possible streaks become bad at any point, return "bad" immediately.
  • After processing all characters, if both good and bad paths exist, return "mixed"; otherwise return "good".

Working Code

def classifyStrings(s):
    vowels = {'a', 'e', 'i', 'o', 'u'}
    # Track possible consecutive vowel and consonant streaks ending at current position
    possible_v_streaks = {0}
    possible_c_streaks = {0}

    has_bad_path = False

    for char in s:
        new_v_streaks = set()
        new_c_streaks = set()

        if char in vowels:
            # Must be a vowel: extend existing vowel streaks, reset consonant streaks to 0
            for v in possible_v_streaks:
                new_v_streaks.add(v + 1)
            new_c_streaks.add(0)
        elif char == '?':
            # Option 1: treat as vowel
            for v in possible_v_streaks:
                new_v_streaks.add(v + 1)
            new_c_streaks.add(0)
            # Option 2: treat as consonant
            for c in possible_c_streaks:
                new_c_streaks.add(c + 1)
            new_v_streaks.add(0)
        else:
            # Must be a consonant: extend existing consonant streaks, reset vowel streaks to 0
            for c in possible_c_streaks:
                new_c_streaks.add(c + 1)
            new_v_streaks.add(0)

        # Check if any current streak is bad
        current_has_bad = False
        current_has_good = False
        for v in new_v_streaks:
            if v >= 3:
                current_has_bad = True
            else:
                current_has_good = True
        for c in new_c_streaks:
            if c >= 5:
                current_has_bad = True
            else:
                current_has_good = True

        # Update global flag for bad paths
        if current_has_bad:
            has_bad_path = True

        # If no valid good streaks left, all paths are bad
        if not current_has_good:
            return "bad"

        # Filter out bad streaks (no need to track them further)
        possible_v_streaks = {v for v in new_v_streaks if v < 3}
        possible_c_streaks = {c for c in new_c_streaks if c < 5}

    # After processing all characters
    if has_bad_path:
        return "mixed"
    else:
        return "good"

Testing the Tricky Cases

Let's verify the cases you mentioned:

  • "?aa": Can be replaced to "aaa" (bad) or "baa" (good) → returns "mixed".
  • "a?a": Can be "aaa" (bad) or "aba" (good) → returns "mixed".
  • "aba": No streaks exceed thresholds → returns "good".
  • "bab": No streaks exceed thresholds → returns "good".
  • "aaaa": Hits 3 consecutive vowels on the third character → returns "bad".
  • "?????": Can be 5 consonants (bad) or a safe combination like "aabbb" (good) → returns "mixed".

内容的提问来源于stack exchange,提问作者Iman.G

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 09:47:37