回顾用的,原题链接:. - 力扣(LeetCode)
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 s
,如果它是 回文串 ,返回 true
;否则,返回 false
。
示例与解释
示例 1
输入: s = "A man, a plan, a canal: Panama"
输出:true
解释:在移除非字母数字字符并将大写转换为小写后,得到的字符串是 "amanaplanacanalpanama"
,这是一个回文串。
示例 2
输入:s = "race a car"
输出:false
解释:在移除非字母数字字符并将大写转换为小写后,得到的字符串是 "raceacar"
,这不是一个回文串。
示例 3
输入:s = " "
输出:true
解释:在移除非字母数字字符后,得到的字符串是空字符串 ""
。空字符串正着反着读都一样,所以是回文串。
题目要求
给定一个字符串 s
,编写一个函数来判断它是否为回文串,并返回相应的布尔值。
提示
1 <= s.length <= 2 * 10^5
s
仅由可打印的 ASCII 字符组成class Solution { public: bool isPalindrome(std::string s) { int slow = 0, fast = s.size() - 1; while (slow < fast) { // 跳过slow指向的非字母数字字符 while (slow < fast && !isalnum(s[slow])) { slow++; } // 跳过fast指向的非字母数字字符 while (slow < fast && !isalnum(s[fast])) { fast--; } // 如果两个指针都越过了对方,说明所有字符都已检查完毕 if (slow >= fast) { break; } // 比较两个字母数字字符是否相等(不区分大小写) if (tolower(s[slow]) != tolower(s[fast])) { return false; } // 继续检查下一对字符 slow++; fast--; } // 所有字符都已检查完毕且都相等,是回文 return true; } };