>验证回文串<
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:
1.本题中,我们 将空字符串定义为有效的回文串 。
//提示
1. 1 <= s.length <= 2 * 105
2. 字符串 s 由 ASCII 字符组成
实例1:
输入: "A man, a plan, a canal: Panama"
输出: true
解释:"amanaplanacanalpanama" 是回文串
实例2:
输入: "race a car"
输出: false
解释:"raceacar" 不是回文串
一、解题思路
1、解法一( C++ )
解法思路:先用标准库函数isalnum()方法筛选出字母与数字,再用isupper()方法筛选出大写字符,用tolower()方法转为小写字符,然后再一前一后进行双索引遍历 。
代码如下:
class Solution {
public:
bool isPalindrome(string s) {
string myStr = changeStr(s);
//一前一后双索引遍历(i与r)
for (int i = 0,r = myStr.size() - 1; i < r; i++, r--)
if (myStr[i] != myStr[r])
return false;
return true;
}
private:
//先对原文进行处理,用标准库函数isalnum筛选出字母与数字,再用isupper筛选出大写的,用tolower转为小写
//工具函数,将字符串的标点空格去掉,大写变小写
string changeStr(string s){
string myStr;
for (char c : s)
if (isalnum(c)) {
if (isupper(c)) c = tolower(c);
myStr.push_back(c);
}
return myStr;
}
};
运行结果截图如下:
2、解法二( Java )
解法思路:首先使用 Java toLowerCase()方法(<- 点击查看详细介绍)返回转换后字符的小写形式,如果有的话;否则返回字符本身。然后保留数字或字母,再从零 遍历 到当前字符串长度的二分之一。
代码如下:
class Solution {
public boolean isPalindrome(String s) {
StringBuilder starCcontent = new StringBuilder();
String lowerCase = s.toLowerCase(); // 转换为小写
//Java toLowerCase() 返回转换后字符的小写形式,如果有的话;否则返回字符本身。
for (int i = 0; i < lowerCase.length(); i++) { // 保留数字or字母
char temp = lowerCase.charAt(i);
if ((temp >= 'a' && temp <= 'z') || (temp >= '0' && temp <= '9')) {
starCcontent.append(temp);
}
}
String finalContent = starCcontent.toString();
// 因为去掉了不必要的字符,现在的字符串全部满足条件,只需要遍历0~当前字符串长度/2
// 长度为单数 会忽略比较中间的字符,长度为双数 不影响比较
for (int i = 0; i < finalContent.length()/2; i++) {
if (finalContent.charAt(i) != finalContent.charAt(finalContent.length() - 1 - i)) {
return false;
}
}
return true;
}
}
运行结果截图如下: