小C的回文博弈

110 阅读2分钟

小C和小U在一场激烈的回文博弈中展开对决。游戏从一个初始字符串s开始,规则如下:

  1. 每个玩家轮流行动,每次行动都可以重新排列字符串。
  2. 如果通过重新排列能够形成一个回文串,游戏立即结束,当前玩家获胜。
  3. 如果无法形成回文串,玩家必须删除字符串中的一个字符,游戏继续。

小C总是先手,两人都使用最优策略,最终谁将赢得这场比赛呢?如果小C获胜则输出"C",小U获胜则输出"U"


测试样例

样例1:

输入:s = "aab"
输出:'C'

样例2:

输入:s = "abc"
输出:'C'

样例3:

输入:s = "abcd"
输出:'U'

代码分析

  1. 字符统计

    • 你使用了一个 HashMap 来统计每个字符的出现次数,这是正确的做法。
  2. 奇数次字符的统计

    • 你通过遍历 HashMap 的值来统计出现奇数次的字符数量,这也是正确的。
  3. 胜负判断

    • 你根据奇数次字符的数量来判断胜负,逻辑上也是正确的。

代码提示

  1. 奇数次字符的判断逻辑

    • 你当前的判断逻辑是 if (oddCount %2 == 1 || oddCount == 0),这实际上可以简化为 if (oddCount <= 1),因为 oddCount 为 0 或 1 时,小C获胜。
  2. 代码优化

    • 你可以考虑将字符统计和奇数次字符的统计合并在一起,减少一次遍历。
  3. 边界情况

    • 考虑字符串为空的情况,虽然题目中没有明确说明,但最好加上边界检查。

代码框架

import java.util.HashMap;

public class Main {
    public static char solution(String s) {
        // 创建一个HashMap来统计每个字符的出现次数
        HashMap<Character, Integer> charCount = new HashMap<>();
        
        // 遍历字符串,统计每个字符的出现次数
        for (char c : s.toCharArray()) {
            charCount.put(c, charCount.getOrDefault(c, 0) + 1);
        }
        
        // 计算出现奇数次的字符数量
        int oddCount = 0;
        for (int count : charCount.values()) {
            if (count % 2 != 0) {
                oddCount++;
            }
        }
        
        // 根据奇数次字符的数量判断胜负
        // 如果奇数次字符的数量为0或1,当前玩家获胜
        // 如果奇数次字符的数量为2或更多,当前玩家可以通过删除一个字符来使对方陷入必败局面
        // 注意:小C先手,所以奇数次字符的数量为0或1时,小C获胜;否则小U获胜
        if (oddCount <= 1) { // 优化判断逻辑
            return 'C';
        } else {
            return 'U';
        }
    }

    public static void main(String[] args) {
        System.out.println(solution("aab") == 'C');
        System.out.println(solution("abc") == 'C');
        System.out.println(solution("abcd") == 'U');
    }
}

提示总结

  1. 优化判断逻辑:将 if (oddCount %2 == 1 || oddCount == 0) 简化为 if (oddCount <= 1)
  2. 合并统计逻辑:考虑将字符统计和奇数次字符的统计合并在一起,减少一次遍历。
  3. 边界检查:考虑字符串为空的情况。