题目描述
Cassidy和Eleanore是一对好朋友,她们经常会一起玩游戏。某一天她们玩了一个回文游戏。游戏规则是这样的:给出一个仅包含小写字母的字符串S,在每一个人的回合中,她们会进行两个操作:
-
尝试重新排列这个字符串,如果可以把这个字符串排列成回文字符串,则立即获胜。
-
否则,她们必须删掉字符串中的一个字符。
已知,Cassidy先手,在两个人都采取最佳策略的情况下,谁可以获胜。
输入
输入第一行仅包含一个正整数t,表示数据组数,(t<=10)
接下来有t行,每行有一个字符串S,表示一组测试数据。(|S|<=1000)
输出
对于每组数据输出一行,如果Cassidy获胜,则输出Cassidy,否则输出Eleanore
样例输入
2
aba
ab
样例输出
Cassidy
Eleanore
作者:Galliano、
链接:https://www.nowcoder.com/discuss/403152?type=all&order=time&pos=&page=1
来源:牛客网
/**
* 微众 第 2 题,先手博弈问题
*/
public static void main2(String[] args) {
Scanner sc = new Scanner(System.in);
int t = Integer.parseInt(sc.nextLine());
for (int i = 0; i < t; i++) {
String str = sc.nextLine();
System.out.println(whoWin(str));
}
sc.close();
}
private static String whoWin(String str) {
String p1 = "Cassidy", p2 = "Eleanore"; // p1先手
// 判断奇数次字符的个数
// 若该个数为 奇数次,则无论如何都是 Cassidy 赢;
// 若该个数为 偶数次,则无论如何都是 Eleanore 赢
return ((oddCharNum(str) & 1) != 0) ? p1 : p2;
}
// 判断一个字符串的出现奇数次字符的个数
private static int oddCharNum(String str) {
int[] arr = new int[26];
for (int i = 0; i < str.length(); i++) arr[str.charAt(i) - 'a'] += 1;
int oddNum = 0; // 奇数次字符的个数
for (int num : arr) {
if ((num & 1) != 0) oddNum++; // 该字符出现了奇次
}
return oddNum;
}
// 该方法没有被使用
// 判断一个字符串串能否被重排成回文串
private static boolean canPalindromic(String str) {
int[] arr = new int[26];
for (int i = 0; i < str.length(); i++) arr[str.charAt(i) - 'a'] += 1;
int count = 0;
// 若有两个以上字符出现了奇次,则一定不是回文串,否则是回文串
for (int num : arr) {
if ((num & 1) != 0) { // 出现奇次的字符
count++;
if (count >= 2) return false;
}
}
return true;
}