1 条题解
-
0
📝 题目大意
给定字符串 和 ,已知 是在 的某个位置插入一个小写字母得到的。找出插入的字母在 中是从首字母开始的第几个字符(即 索引的位置)。
💡 解题思路
-
题目分析:,且 与 仅有一个字符的差异。由于 是在 中插入一个字符得到的,因此 和 的字符在插入位置之前完全相同,从插入位置开始 的字符相对于 会整体向后偏移一位。
-
算法推导:
- 设 为
n, 为m。 - 从头开始同时扫描 和 ,即比较
n[i]与m[i]( 从 开始)。 - 第一个满足
n[i] != m[i]的位置 就是插入发生的位置——此时m[i]即为被插入的字符。 - 输出 (因为题目要求 索引)。
- 若插入位置在末尾(即 的所有字符与 的前 个字符完全匹配),则当 时,
n[|S|]访问到字符串末尾的'\0',而m[|S|]是 的最后一个字符,两者必然不同,因此输出 ,同样正确。
- 设 为
-
边界与细节:
- ,,循环条件
i <= m.size()-1中的m.size()-1不会发生无符号下溢。 - 题目允许任意合法位置输出,因此找到第一个不匹配位置直接输出并
break即可。 - 由于 C++ 中
std::string的operator[]不进行越界检查,在末尾插入的情况下访问n[|S|]会得到'\0',不会引发运行时错误,且逻辑正确。
- ,,循环条件
⏱️ 复杂度分析
- 时间复杂度:,最坏情况下需要遍历整个 (当插入位置在末尾时)。
- 空间复杂度:,用于存储两个输入字符串。
💻 标准代码 (C++)
#include<bits/stdc++.h> using namespace std; int main(){ string n, m; // n = S, m = T cin >> n >> m; // 从头扫描,找到第一个不匹配的位置 for (int i = 0; i <= m.size() - 1; i++) { if (n[i] != m[i]) { // 插入发生在此处 cout << i + 1; // 输出 1 索引的位置 break; // 任意一个合法位置即可,找到即退出 } } return 0; } -
- 1
信息
- ID
- 660
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者