1 条题解
-
0
📝 题目大意
给定两个仅含小写英文字母的字符串 和 ,判断 是否为 的前缀(即 的前 个字符是否恰好等于 )。
💡 解题思路
-
题目分析:字符串长度 ,数据规模极小,直接按定义模拟即可。核心约束: 作为前缀,长度不能超过 ,否则必然不是前缀。
-
算法推导:
- 读入 (代码中变量
n)和 (代码中变量m)。 - 记 ,。
- 剪枝:若 , 不可能为 的前缀,直接输出
No并结束。 - 遍历 ,逐个比较 与 :
- 若存在 ,输出
No并结束。
- 若存在 ,输出
- 所有前 个字符均匹配,输出
Yes。
- 读入 (代码中变量
-
边界与细节:
- 和 相等时, 是 的前缀(样例 3),算法中 ,逐字符比较全部相等后输出
Yes,逻辑正确。 - 长于 时(样例 4),长度判断直接剪枝输出
No,避免后续数组越界访问。 - 循环边界
i <= x-1等价于i < x,注意不要写成i <= x导致多比较一次。 - 输出区分大小写,必须严格输出
Yes或No。
- 和 相等时, 是 的前缀(样例 3),算法中 ,逐字符比较全部相等后输出
⏱️ 复杂度分析
- 时间复杂度:,至多比较 个字符。由于 ,实际为 级别。
- 空间复杂度:,仅存储两个输入字符串。
💻 标准代码 (C++)
#include<bits/stdc++.h> using namespace std; int main(){ string n, m; // n = S, m = T cin >> n >> m; // 读入两个字符串 int x, y; x = n.size(); // x = |S| y = m.size(); // y = |T| if(x > y){ // 剪枝:S 比 T 长,不可能为前缀 cout << "No"; return 0; } for(int i = 0; i <= x - 1; i++){ // 逐一比较前 x 个字符 if(n[i] != m[i]){ // 发现不匹配 cout << "No"; return 0; } } cout << "Yes"; // 全部匹配,S 是 T 的前缀 return 0; } -
- 1
信息
- ID
- 630
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者