1 条题解

  • 0
    @ 2026-6-19 10:31:01

    📝 题目大意

    给定两个字符串 sss1s1(长度可能不同),找出第一个字符不同的位置(下标从 11 开始)。若两串完全相同,输出 00

    💡 解题思路

    1. 题目分析:题目要求找第一个不同字符,数据范围未给出上限,但字符串操作本身是 O(max(s,s1))O(\max(|s|, |s1|)) 的简单遍历。关键难点在于两个字符串长度可能不同——当较短串遍历完毕后,超出部分该如何判断?

    2. 算法推导

      • 朴素想法:先统一长度,把短串补齐再比较。但这样需要额外构造字符串,不优雅。
      • 标准解法(与 std.cpp 一致):利用 C++ 中 std::string 的特性——a[i]i = a.size() 时返回 '\0'(空字符,值为 0)。因此可以直接循环到 max(a,b)\max(|a|, |b|)
        • i<min(a,b)i < \min(|a|, |b|) 时,正常比较 a[i]b[i]
        • ii 超出较短串长度时,短串返回 '\0',长串返回一个实际字符,二者必然不等,此时 i+1 即为答案。
        • 这也解释了样例 2:"abcde""abcdefg",前 5 个字符相同,第 6 个位置 a[5]'\0'b[5]'f',不等,输出 66
      • 若循环结束未触发 return,说明两串完全相同,输出 00
    3. 边界与细节

      • 长度不等:如上述,'\0' 与任何非空字符比较都会触发输出,位置为较短串长度 +1+1
      • 空串:若其中一个或两个串为空,max(a.size(), b.size()) 可能为 00,此时循环不执行,直接输出 00(两个空串相等)。
      • 下标陷阱:题目要求 11 索引,代码中循环变量 ii00 开始,输出时需 +1+1

    ⏱️ 复杂度分析

    • 时间复杂度:最坏情况下遍历至 max(a,b)\max(|a|, |b|) 位置,即 O(max(a,b))O(\max(|a|, |b|))
    • 空间复杂度:仅存储两个输入字符串,O(a+b)O(|a| + |b|)

    💻 标准代码 (C++)

    #include <bits/stdc++.h>
    using namespace std;
    
    int main () {
        string a, b;
        cin >> a >> b;
        // 循环到较长字符串的长度
        for (int i = 0; i < max(a.size(), b.size()); i++) {
            // a[i] 或 b[i] 超出自身长度时返回 '\0',与对方字符比较必然不等
            if (a[i] != b[i]) {
                printf("%d", i + 1); // 下标从 1 开始,所以 i+1
                return 0;
            }
        }
        // 循环结束说明两串完全相同
        printf("0");
        return 0;
    }
    
    • 1

    信息

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