题解
字符串判等
1 条题解
-
0
解题思路
这道题要我们判断两个字符串是否“相等”。这里说的相等有一个特别的规则:如果字符串里含有字母,比较的时候要忽略大小写。
也就是说,“abc” 和 “ABC” 要算作相等,因为 a 和 A 只是大小写不同。
怎么忽略大小写呢?C++ 里大写字母和小写字母在 ASCII 码表中是挨着的:
- 大写字母 'A' 的 ASCII 码是 65,小写字母 'a' 的 ASCII 码是 97;
- 大写字母 'A' 到 'Z' 是连续的,小写字母 'a' 到 'z' 也是连续的。
所以如果某个字符是大写字母,我们给它加上 32,就得到了它的小写字母(例如 'A' + 32 = 'a')。把两个字符串的每个字符都先转成小写,再比较,就能忽略大小写了。
解题步骤:
- 先判断两个字符串的长度是否一样,长度不一样肯定不相等;
- 长度一样的话,逐个字符比较:把两个字符都转成小写(如果原本是大写),看是否相同;
- 只要有一个字符不同,答案就是 no;全部相同才是 yes。
这种方法叫做“转换后比较”,是处理大小写问题的常用套路。
参考代码
// P4590 字符串判等:忽略字母大小写比较两个字符串是否相等 #include <iostream> using namespace std; int main() { string a, b; cin >> a >> b; // 输入两个字符串 bool ok = true; // ok 记录是否相等,先假设相等 if (a.size() != b.size()) ok = false; // 长度不同一定不相等 for (int i = 0; ok && i < (int)a.size(); i++) { char x = a[i], y = b[i]; // 大写字母转成小写再比较(ASCII 码加 32) if ('A' <= x && x <= 'Z') x += 32; if ('A' <= y && y <= 'Z') y += 32; if (x != y) ok = false; // 这一对字符不相等,结果就是 no } cout << (ok ? "yes" : "no") << endl; return 0; }复杂度分析
两个字符串的长度都不会超过 50,程序只需要把每个字符看一遍,时间大约是 O(n),其中 n 是字符串的长度。额外用到的变量只有几个,空间是 O(1),非常节省。
- 1