让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
问题描述:
根据给定的输入字符串,判断其是否是回文序列(正反读都一样),若是则返回 true,否则返回 false。
样例:
输入: "racecar"
输出: true
输入: "hello"
输出: false
输入: "A man a plan a canal Panama"
输出: true
解答:
- 直接判断法 思路:将字符串正序和反序,然后逐个字符进行比较,如果相同则说明是回文序列。 代码实现: bool isPalindrome(string s) { string str = ""; for (char c : s) { if (isalnum(c)) { str += tolower(c); } } int n = str.size(); for (int i = 0; i < n / 2; ++i) { if (str[i] != str[n - 1 - i]) { return false; } } return true; } 时间复杂度:O(n) 空间复杂度:O(n)
- 双指针法 思路:使用两个指针 left 和 right,分别从两端开始遍历字符串,同时判断是否相等。 代码实现: bool isPalindrome(string s) { int n = s.size(); int left = 0, right = n - 1; while (left < right) { while (left < right && !isalnum(s[left])) { ++left; } while (left < right && !isalnum(s[right])) { --right; } if (tolower(s[left]) != tolower(s[right])) { return false; } ++left; --right; } return true; } 时间复杂度:O(n) 空间复杂度:O(1)
- STL 做法 思路:使用 STL 的函数 reverse 能够将字符串反转,再通过比较两个字符串是否相等,判断是否为回文序列。 代码实现: bool isPalindrome(string s) { string str = ""; for (char c : s) { if (isalnum(c)) { str += tolower(c); } } string rev_str = str; reverse(rev_str.begin(), rev_str.end()); return str == rev_str; } 时间复杂度:O(n) 空间复杂度:O(n)