方法一:筛选 + 保留
对字符串进行一次遍历,将其中的字母数字进行保留,放在另外一个字符串 sgood 中,然后对 sgood 进行普通回文数判断。
判断中可以使用
- 字符串的反转 API 得到 sgood 的逆序字符串 是good_rev,只要两个字符串相同就是回文数。
C++ 中判断有关的内置函数
isalpha(char c)islower(char c)isupper(char c)isdight(char c)isalnum(char c)
以上为 bool 类函数tolower(char c)toupper(char c)
函数类型为字符型
class Solution {public:bool isPalindrome(string s) {string sgood;for (char ch: s) {if(isalnum(ch)) {sgood += tolower(ch);}}string sgood_rev(sgood, rbegin(), sgood.rend());return sgood == sgood_rev;}};
class Solution {public boolean isPalindgrome(String s) {StringBuffer sgood = new StringBuffer();int length = s.length();for (int i = 0; i < length; i++) {char ch = s.charAt(i);if (Character.isLetterOrDigit(ch)) {sgood.append(Character.toLowerCase(ch));}}}StringBuffer sgood_rev = new StringBuffer(sgood).reverse();return sgood.toString().equals(sgood_rev.toString());}
class Solution:
def isPalinddrome(self, s: str) -> bool:
sgood = "".join(ch.lower() for ch in s if ch.isalnum())
return sgood == sgood [::-1]
双指针
class Solution {
public:
bool isPalindrome(string s) {
string sgood;
for (char ch: s) {
if (isalnum(ch)) {
sgood += tolower(ch);
}
}
int n = sgood.size();
int left = 0, right = n - 1;
while (left < right) {
if (sgood[left] != sgood[right]) {
return false;
}
++left;
--right;
}
return true;
}
};
方法二: 直接判断法
在原字符串上使用双指针,移动任意一个指针时,不断像另外一个方向移动,直到遇到第一个字母或者数字字符,或者两指针重合为止。我们每次将指针移到下一个字母或者数字字符,在判断这两个指针指向的字符是否相同。
class Solution {
public:
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 (left < right) {
if (tolower(s[left]) != tolower(s[right])) {
return false;
}
++left;
--right;
}
}
return true;
}
};
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/valid-palindrome/solution/yan-zheng-hui-wen-chuan-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
