小C和小U在一场激烈的回文博弈中展开对决。游戏从一个初始字符串s开始,规则如下:
- 每个玩家轮流行动,每次行动都可以重新排列字符串。
- 如果通过重新排列能够形成一个回文串,游戏立即结束,当前玩家获胜。
- 如果无法形成回文串,玩家必须删除字符串中的一个字符,游戏继续。
小C总是先手,两人都使用最优策略,最终谁将赢得这场比赛呢?如果小C获胜则输出"C",小U获胜则输出"U"
测试样例
样例1:
输入:
s = "aab"
输出:'C'
样例2:
输入:
s = "abc"
输出:'C'
样例3:
输入:
s = "abcd"
输出:'U'
代码分析
-
字符统计:
- 你使用了一个
HashMap来统计每个字符的出现次数,这是正确的做法。
- 你使用了一个
-
奇数次字符的统计:
- 你通过遍历
HashMap的值来统计出现奇数次的字符数量,这也是正确的。
- 你通过遍历
-
胜负判断:
- 你根据奇数次字符的数量来判断胜负,逻辑上也是正确的。
代码提示
-
奇数次字符的判断逻辑:
- 你当前的判断逻辑是
if (oddCount %2 == 1 || oddCount == 0),这实际上可以简化为if (oddCount <= 1),因为oddCount为 0 或 1 时,小C获胜。
- 你当前的判断逻辑是
-
代码优化:
- 你可以考虑将字符统计和奇数次字符的统计合并在一起,减少一次遍历。
-
边界情况:
- 考虑字符串为空的情况,虽然题目中没有明确说明,但最好加上边界检查。
代码框架
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');
}
}
提示总结
- 优化判断逻辑:将
if (oddCount %2 == 1 || oddCount == 0)简化为if (oddCount <= 1)。 - 合并统计逻辑:考虑将字符统计和奇数次字符的统计合并在一起,减少一次遍历。
- 边界检查:考虑字符串为空的情况。