给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama" 输出: true 解释:"amanaplanacanalpanama" 是回文串
示例 2:
输入: "race a car" 输出: false 解释:"raceacar" 不是回文串
提示:
1 <= s.length <= 2 * 105
- 字符串
s
由 ASCII 字符组成
class Solution:
def isPalindrome(self, s: str) -> bool:
i, j = 0, len(s) - 1
while i < j:
if not s[i].isalnum():
i += 1
elif not s[j].isalnum():
j -= 1
elif s[i].lower() != s[j].lower():
return False
else:
i += 1
j -= 1
return True
class Solution {
public boolean isPalindrome(String s) {
int i = 0, j = s.length() - 1;
while (i < j) {
if (!Character.isLetterOrDigit(s.charAt(i))) {
++i;
} else if (!Character.isLetterOrDigit(s.charAt(j))) {
--j;
} else if (Character.toUpperCase(s.charAt(i)) != Character.toUpperCase(s.charAt(j))) {
return false;
} else {
++i;
--j;
}
}
return true;
}
}
class Solution {
public:
bool isPalindrome(string s) {
int i = 0, j = s.size() - 1;
while (i < j) {
if (!isAlphaNum(s[i])) ++i;
else if (!isAlphaNum(s[j])) --j;
else if ((s[i] + 32 - 'a') % 32 != (s[j] + 32 - 'a') % 32) return false;
else {
++i;
--j;
}
}
return true;
}
private:
bool isAlphaNum(char &ch) {
if (ch >= 'a' && ch <= 'z') return true;
if (ch >= 'A' && ch <= 'Z') return true;
if (ch >= '0' && ch <= '9') return true;
return false;
}
};
using System.Linq;
public class Solution {
public bool IsPalindrome(string s) {
var chars = s.Where(ch => char.IsLetterOrDigit(ch)).Select(char.ToLower).ToList();
var i = 0;
var j = chars.Count - 1;
for (; i < j; ++i, --j)
{
if (chars[i] != chars[j]) return false;
}
return true;
}
}
/**
* @param {string} s
* @return {boolean}
*/
var isPalindrome = function (s) {
let arr1 = [],
arr2 = [];
for (let i = 0; i < s.length; i++) {
if (s[i] >= 'A' && s[i] <= 'Z') {
arr1.push(s[i].toLowerCase());
}
if ((s[i] >= '0' && s[i] <= '9') || (s[i] >= 'a' && s[i] <= 'z')) {
arr1.push(s[i]);
}
}
arr2 = [...arr1];
arr2.reverse();
return arr1.join('') === arr2.join('');
};
/**
* @param {string} s
* @return {boolean}
*/
var isPalindrome = function (s) {
function isNumOrAl(a) {
if (
(a >= 'A' && a <= 'Z') ||
(a >= '0' && a <= '9') ||
(a >= 'a' && a <= 'z')
) {
return true;
} else {
return false;
}
}
if (s.length === 0) {
return true;
}
let i = 0,
j = s.length - 1;
while (i < j) {
while (i < j && !isNumOrAl(s[i])) {
i++;
}
while (i < j && !isNumOrAl(s[j])) {
j--;
}
if (s[i].toLowerCase() !== s[j].toLowerCase()) {
return false;
} else {
i++;
j--;
}
}
return true;
};
function isPalindrome(s: string): boolean {
let left: number = 0,
right: number = s.length - 1;
while (left < right) {
let char1: string = s.charAt(left);
let char2: string = s.charAt(right);
if (!/[a-zA-Z0-9]/.test(char1)) {
++left;
} else if (!/[a-zA-Z0-9]/.test(char2)) {
--right;
} else if (char1.toLocaleLowerCase() != char2.toLocaleLowerCase()) {
return false;
} else {
++left;
--right;
}
}
return true;
}
function isPalindrome(s: string): boolean {
const isAlphanumeric = (c: string) => {
return (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9');
};
const cs = s.toLocaleLowerCase().split('').filter(isAlphanumeric);
return cs.join('') === cs.reverse().join('');
}
impl Solution {
pub fn is_palindrome(s: String) -> bool {
let s = s.to_lowercase();
let s = s.as_bytes();
let n = s.len();
let (mut l, mut r) = (0, n - 1);
while l < r {
while l < r && !s[l].is_ascii_alphanumeric() {
l += 1;
}
while l < r && !s[r].is_ascii_alphanumeric() {
r -= 1;
}
if s[l] != s[r] {
return false;
}
l += 1;
if r != 0 {
r -= 1;
}
}
true
}
}