1 条题解
-
0
📝 题目大意
给定两个字符串 和 (长度可能不同),找出第一个字符不同的位置(下标从 开始)。若两串完全相同,输出 。
💡 解题思路
-
题目分析:题目要求找第一个不同字符,数据范围未给出上限,但字符串操作本身是 的简单遍历。关键难点在于两个字符串长度可能不同——当较短串遍历完毕后,超出部分该如何判断?
-
算法推导:
- 朴素想法:先统一长度,把短串补齐再比较。但这样需要额外构造字符串,不优雅。
- 标准解法(与 std.cpp 一致):利用 C++ 中
std::string的特性——a[i]当i = a.size()时返回'\0'(空字符,值为 0)。因此可以直接循环到 :- 当 时,正常比较
a[i]和b[i]。 - 当 超出较短串长度时,短串返回
'\0',长串返回一个实际字符,二者必然不等,此时i+1即为答案。 - 这也解释了样例 2:
"abcde"和"abcdefg",前 5 个字符相同,第 6 个位置a[5]是'\0',b[5]是'f',不等,输出 。
- 当 时,正常比较
- 若循环结束未触发
return,说明两串完全相同,输出 。
-
边界与细节:
- 长度不等:如上述,
'\0'与任何非空字符比较都会触发输出,位置为较短串长度 。 - 空串:若其中一个或两个串为空,
max(a.size(), b.size())可能为 ,此时循环不执行,直接输出 (两个空串相等)。 - 下标陷阱:题目要求 索引,代码中循环变量 从 开始,输出时需 。
- 长度不等:如上述,
⏱️ 复杂度分析
- 时间复杂度:最坏情况下遍历至 位置,即 。
- 空间复杂度:仅存储两个输入字符串,。
💻 标准代码 (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
- 上传者