如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 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 * 105
s
仅由可打印的 ASCII 字符组成
思路:
1、isalpha(),用来判断一个字符是否为字母,如果是字字母则返回非零,否则返回零。
2、isdigit(),用来判断一个字符是否为数字,如果是数字则返回非零,否则返回零。
3、isalnum(),用来判断一个字符是否为数字或者字母,是返回非零,不是返回0。
4、islower(),用来判断一个字符是否为小写字母。是返回非零,不是返回0。
5、isupper(),用来判断一个字符是否为大写字母。是返回非零,不是返回0。
6、toupper(a),a为字符时,如果a是小写字母则将其转换为大写字母,否则不变。a为数字字符则返回其对应ASCLL。
7、tolower(a),a为字符时,如果a是大写字母则将其转换为小写字母,否则不变。a为数字字符则返回其对应ASCLL。
8、定义首尾指针low、high,low++找到第一个字母或数字,high--找到第一个字母或数字,通过大小写转换判断其是否相等,相等则继续判断,不相等直接返回false。
9、遍历完最后返回true。
代码实现:
class Solution {
public:
bool isCharAndNum(char s) //判断是否是字母或数字
{
if(isalnum(s))
return true;
return false;
}
bool isPalindrome(string s) {
if(s.size() == 0)
return true;
int low = 0;
int high = s.size() - 1;
while(low < high)
{
while(low < high && !isCharAndNum(s[low]))
++low;
while(low < high && !isCharAndNum(s[high]))
--high;
if(s[low] == s[high] || tolower(s[low]) == s[high] || toupper(s[low]) == s[high])
{
++low;
--high;
continue;
}
else
return false;
}
return true;
}
};