1 条题解
-
0
📝 题目大意
给定 个长度为 的字符串,判断它们是否构成一组合法的扑克牌手牌:每个字符串的第一位必须是四种花色(
H,D,C,S)之一,第二位必须是 13 种点数(A,2~9,T,J,Q,K)之一,且所有字符串互不相同。💡 解题思路
-
题目分析:本题需要验证三个条件,本质上是在判断给定的 个字符串是否都是合法的扑克牌表示,且没有重复。约束 恰好等于一副扑克牌的总张数(),这暗示了最多不可能超过 52 张不重复的牌。
-
算法推导:
- 去重检查:使用双重循环遍历所有字符串对 ,若 且 ,说明存在重复,直接输出
No并退出。由于 , 的复杂度完全可行。 - 合法性检查:遍历每个字符串 :
- 检查第一位字符 是否为
H、D、C、S之一。 - 检查第二位字符 是否为
A、2~9、T、J、Q、K之一。 - 若任一条件不满足,输出
No并退出。
- 检查第一位字符 是否为
- 若所有检查通过,输出
Yes。
- 去重检查:使用双重循环遍历所有字符串对 ,若 且 ,说明存在重复,直接输出
-
边界与细节:
- 注意 时,重复检查的循环不会触发,直接进入合法性检查,逻辑正确。
- 第二位字符的判断中,数字
2~9是字符范围比较s[i][1] >= '2' && s[i][1] <= '9',而A、T、J、Q、K是离散的字符相等判断,注意不要遗漏T。 - 题目保证输入的字符串长度均为 ,且只包含大写字母和数字,所以无需额外校验长度。
⏱️ 复杂度分析
- 时间复杂度:,其中 ,最坏情况下双重循环执行约 次比较,完全可行。
- 空间复杂度:,用于存储 个字符串。
💻 标准代码 (C++)
#include<bits/stdc++.h> using namespace std; int main(){ string s[5555]; // 存储所有字符串,开足够大的数组 int n; cin >> n; // 读入 n 个长度为 2 的字符串 for(int i = 1; i <= n; i++) cin >> s[i]; // 条件3:检查是否存在重复字符串 for(int i = 1; i <= n; i++){ for(int j = 1; j <= n; j++){ if(i != j){ if(s[i] == s[j]){ cout << "No"; return 0; } } } } // 条件1 & 2:检查每个字符串的合法性 for(int i = 1; i <= n; i++){ // 条件1:第一位必须是 H, D, C, S 之一 if(s[i][0] == 'H' || s[i][0] == 'D' || s[i][0] == 'C' || s[i][0] == 'S'){ // 条件2:第二位必须是 A, 2~9, T, J, Q, K 之一 if((s[i][1] >= '2' && s[i][1] <= '9') || s[i][1] == 'A' || s[i][1] == 'T' || s[i][1] == 'J' || s[i][1] == 'Q' || s[i][1] == 'K'){ continue; // 该字符串合法,继续检查下一个 } else { cout << "No"; return 0; } } else { cout << "No"; return 0; } } // 所有条件全部满足 cout << "Yes"; return 0; } -
- 1
信息
- ID
- 648
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者