大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。
题目考察的知识点
字符串处理,回文判断。
题目解答方法的文字分析
题目要求我们判断给定的昵称是否为回文昵称。回文昵称的定义是,在去除非字母数字字符和忽略大小写后,如果正着读和反着读都一样(空串我们认为是回文),则该昵称被认为是回文昵称。
为了解决这个问题,我们可以采用以下思路:
思路:
- 首先,我们需要对给定的昵称字符串进行预处理,去除非字母数字字符,并将所有字符转换为小写。
- 然后,我们可以使用双指针的方法,一个指针从字符串的开头开始,另一个指针从字符串的末尾开始,比较两个指针指向的字符是否相同,如果不同,则该昵称不是回文昵称,返回 false。
- 如果两个指针指向的字符相同,继续向中间靠拢,直到两个指针相遇或者交叉,此时该昵称是回文昵称,返回 true。
需要注意的是,在进行比较时,我们只需要考虑字母数字字符,其他字符可以忽略。
举个例子:假设昵称 s = "A man, a plan, a canal, Panama!"。
- 预处理昵称,去除非字母数字字符并转换为小写,得到 "amanaplanacanalpanama"。
- 使用双指针,一个指向开头的字符 "a",另一个指向末尾的字符 "a",相同,继续向中间靠拢。
- 指针分别指向 "m" 和 "m",相同,继续向中间靠拢。
- 指针分别指向 "n" 和 "n",相同,继续向中间靠拢。
- ...直到指针分别指向 "p" 和 "p",相同,此时指针相遇,该昵称是回文昵称,返回 true。
本题解析所用的编程语言
C++
完整且正确的编程代码
class Solution { public: bool isPalindromeNickname(string s) { // 预处理昵称,去除非字母数字字符并转换为小写 string processed; for (char c : s) { if (isalnum(c)) { // 判断是否为字母或数字字符 processed += tolower(c); // 转换为小写字符 } } // 使用双指针判断是否为回文昵称 int left = 0; int right = processed.size() - 1; while (left < right) { if (processed[left] != processed[right]) { return false; } left++; right--; } return true; } };
您的关注、点赞、收藏就是我创作的动力,三连支持阿Q!