1 条题解

  • 0
    @ 2026-6-19 10:30:19

    📝 题目大意

    给定 NN 个长度为 22 的字符串,判断它们是否构成一组合法的扑克牌手牌:每个字符串的第一位必须是四种花色(H, D, C, S)之一,第二位必须是 13 种点数(A, 2~9, T, J, Q, K)之一,且所有字符串互不相同。

    💡 解题思路

    1. 题目分析:本题需要验证三个条件,本质上是在判断给定的 NN 个字符串是否都是合法的扑克牌表示,且没有重复。约束 N52N \leq 52 恰好等于一副扑克牌的总张数(4×13=524 \times 13 = 52),这暗示了最多不可能超过 52 张不重复的牌。

    2. 算法推导

      • 去重检查:使用双重循环遍历所有字符串对 (i,j)(i, j),若 iji \ne jsi=sjs_i = s_j,说明存在重复,直接输出 No 并退出。由于 N52N \leq 52O(N2)O(N^2) 的复杂度完全可行。
      • 合法性检查:遍历每个字符串 sis_i
        • 检查第一位字符 si[0]s_i[0] 是否为 HDCS 之一。
        • 检查第二位字符 si[1]s_i[1] 是否为 A2~9TJQK 之一。
        • 若任一条件不满足,输出 No 并退出。
      • 若所有检查通过,输出 Yes
    3. 边界与细节

      • 注意 N=1N=1 时,重复检查的循环不会触发,直接进入合法性检查,逻辑正确。
      • 第二位字符的判断中,数字 2~9 是字符范围比较 s[i][1] >= '2' && s[i][1] <= '9',而 ATJQK 是离散的字符相等判断,注意不要遗漏 T
      • 题目保证输入的字符串长度均为 22,且只包含大写字母和数字,所以无需额外校验长度。

    ⏱️ 复杂度分析

    • 时间复杂度O(N2)O(N^2),其中 N52N \leq 52,最坏情况下双重循环执行约 52×51=265252 \times 51 = 2652 次比较,完全可行。
    • 空间复杂度O(N)O(N),用于存储 NN 个字符串。

    💻 标准代码 (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
    上传者