题目:
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:
本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: “A man, a plan, a canal: Panama”
输出: true
示例 2:
输入: “race a car”
输出: false
代码:
package leetCode;
/**
* 2018.7.21
*验证回文字符串
* @author dhc
*
*/
public class OneHunderdAndTwentyFive {
//先提取出只包含字母和数字的字符串,利用reverse函数判断
public static boolean isPalindrome(String s) {
if(s == null) {
return true;
}
char[] str = new char[s.length()];
int index = 0;
for(int i = 0;i < s.length();i++) {
if(( s.charAt(i) >= '0' && s.charAt(i) <= '9') || (s.charAt(i) >= 'a' && s.charAt(i) <= 'z') ||(s.charAt(i) >= 'A' && s.charAt(i) <= 'Z')) {
str[index++] = s.charAt(i);
}
}
String st = new String(str).trim().toLowerCase();
StringBuffer sb = new StringBuffer(st);
//下面这一步的反转直接让sb的内容反转了(搞了半天才明白),StringBuffer没有重写equals方法,比较 的是地址,因此转为String比较
String st1 = sb.reverse().toString();
if(st.equals(st1)) {
return true;
}
return false;
}
//双指针方法,利用两个指针分别从前往后和从后往前,依次判断 6ms
public static boolean isPalindrome1(String s) {
if(s == null) {
return true;
}
int l = 0;
int r = s.length() - 1;
char lchar = ' ';
char rchar = ' ';
while(l < r) {
//从前往后找到一个有效字符
while(l < r) {
if(( s.charAt(l) >= '0' && s.charAt(l) <= '9') || (s.charAt(l) >= 'a' && s.charAt(l) <= 'z')) {
lchar = s.charAt(l);
l++;
break;
}
//大写字母转小写
if((s.charAt(l) >= 'A' && s.charAt(l) <= 'Z')) {
lchar = (char) (s.charAt(l) - 'A' + 'a');
l++;
break;
}
l++;
}
//从后往前找到一个有效字符
while(r > l) {
if(( s.charAt(r) >= '0' && s.charAt(r) <= '9') || (s.charAt(r) >= 'a' && s.charAt(r) <= 'z')) {
rchar = s.charAt(r);
r--;
break;
}
//大写字母转小写
if((s.charAt(r) >= 'A' && s.charAt(r) <= 'Z')) {
rchar = (char) (s.charAt(r) - 'A' + 'a');
r--;
break;
}
r--;
}
if(lchar != rchar) {
return false;
}
}
return true;
}
public static void main(String[] args) {
String str = "aaA";
System.out.println(isPalindrome1(str));
}
}