1 条题解
-
0
📝 题目大意
给定一个由
<、=、>组成的字符串 ,判断它是否为"双向箭头型"字符串——即恰好由一个<开头、一个>结尾,中间全部由 ()个=填充。💡 解题思路
-
题目分析:
- 字符串长度 ,数据范围极小,直接模拟即可。
- 双向箭头型的定义是严格的:
<+ 若干=+>,不允许任何其他字符穿插。
-
算法推导:
- 设 ,首先 是必要条件(否则长度不足以容纳
<、=、>)。 - 检查 是否为
'<',不满足则直接输出No。 - 检查 是否为
'>',不满足则直接输出No。 - 遍历下标 到 (即中间部分),若存在任何一个字符不是
'=',输出No。 - 上述条件全部满足则输出
Yes。
- 设 ,首先 是必要条件(否则长度不足以容纳
-
边界与细节:
- 题目保证 ,但代码中显式判断 更加安全。
- 中间部分 可以为 吗?题目描述中 是正整数,所以中间至少有一个
=。但代码中循环for (int i = 1; i < n - 1; i++)在 时只会执行一次(检查S[1]),此时 ,符合题意。若 则被前面的 拦截,不会进入循环,逻辑自洽。 - 注意
=是等号,不是减号-。样例 2(==>)因为没有<开头而输出No,样例 3(<> >)因为中间混入了>而输出No。
⏱️ 复杂度分析
- 时间复杂度:,只需遍历字符串一次。
- 空间复杂度:,存储输入字符串。
💻 标准代码 (C++)
#include <iostream> #include <string> using namespace std; int main() { string S; cin >> S; int n = S.length(); // 长度至少为3(至少包含 '<', '=', '>' 各一个) if (n < 3) { cout << "No" << endl; return 0; } // 第一个字符必须是 '<' if (S[0] != '<') { cout << "No" << endl; return 0; } // 最后一个字符必须是 '>' if (S[n - 1] != '>') { cout << "No" << endl; return 0; } // 中间的所有字符必须全部是 '=' for (int i = 1; i < n - 1; i++) { if (S[i] != '=') { cout << "No" << endl; return 0; } } // 所有条件满足,是双向箭头型字符串 cout << "Yes" << endl; return 0; } -
- 1
信息
- ID
- 781
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者