1 条题解

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

    📝 题目大意

    给定两个长度为 nn 的字符串 sstt,判断它们是否相似。相似的定义是:对于每个位置 iisis_itit_i 要么完全相同,要么是 1l 的配对,要么是 0o 的配对。

    💡 解题思路

    1. 题目分析n100n \le 100,数据范围极小,直接逐位比较即可。字符仅包含小写字母和数字,特殊规则只有两组:1l0o
    2. 算法推导:遍历 ii00n1n-1,对每一对 (si,ti)(s_i, t_i) 依次检查:
      • si=tis_i = t_i,直接跳过(continue);
      • {si,ti}={1,l}\{s_i, t_i\} = \{1, l\},跳过;
      • {si,ti}={0,o}\{s_i, t_i\} = \{0, o\},跳过;
      • 否则将标记 flag 置为 false,表示存在不相似的位置。
    3. 边界与细节
      • 需要区分字符 '1'(数字)和 'l'(小写字母 L),以及 '0'(数字零)和 'o'(小写字母 O),代码中必须用单引号包裹。
      • 配对是双向的,检查时需同时覆盖 (1,l)(1, l)(l,1)(l, 1) 两种情况,同理 (0,o)(0, o)(o,0)(o, 0)
      • 只要有一对字符不满足上述任一条件,整个字符串对就不相似,输出 No

    ⏱️ 复杂度分析

    • 时间复杂度O(n)O(n),只需一次线性遍历。
    • 空间复杂度O(1)O(1),仅使用常数个变量。

    💻 标准代码 (C++)

    #include <bits/stdc++.h>
    using namespace std;
    
    int main () {
        int n;
        bool flag = 1;          // 标记是否相似,初始为 true
        cin >> n;
        string a, b;
        cin >> a >> b;
        for (int i = 0; i < n; i++) {
            if (a[i] == b[i]) continue;     // 完全相同,跳过
            else if ((a[i] == '1' && b[i] == 'l') || (a[i] == 'l' && b[i] == '1'))
                continue;                     // 1 和 l 配对,跳过
            else if ((a[i] == '0' && b[i] == 'o') || (a[i] == 'o' && b[i] == '0'))
                continue;                     // 0 和 o 配对,跳过
            else flag = 0;                    // 不满足任何相似条件,标记为 false
        }
        if (flag == 0) printf("No");
        else printf("Yes");
        return 0;
    }
    
    • 1

    信息

    ID
    717
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者