题目:判断字符串是否是回文字符串,只考虑字符串中的数字和字符,不考虑标点符号
例如:"A man, a plan, a canal: Panama"
是回文字符串
"race a car"
不是回文字符串
方法1:使用额外的内存空间 注意:测试时输入的字符串是带""引号的
public class Solution {
public boolean isPalindrome(String s) {
//先把字符串都转成小写
String str = s.toLowerCase();
StringBuilder sb = new StringBuilder();
//把有效字符保存到sb中
for (int i = 0; i < str.length(); i++) {
if((str.charAt(i) >= 'a' && str.charAt(i) <= 'z')
|| (str.charAt(i) >= '0' && str.charAt(i) <= '9')){
sb.append(str.charAt(i));
}
}
//如果sb的长度为0.则说明没有有效字符,该字符串相当于null串,空串是回文字符串
if (sb.length() == 0) {
return true;
}
//首尾两个指针对比
for (int i = 0, j = sb.length() - 1; i <= j; i++,j--) {
if (sb.charAt(i) != sb.charAt(j)) {
return false;
}
}
return true;
}
}
方法2,不使用额外内存,用首尾两个指针判断
public class Solution {
public boolean isPalindrome(String s) {
s = s.toLowerCase();
int start = 0;
int end = s.length() - 1;
while (start <= end) {
//判断首字符是否为有效字符
if (!isValid(s.charAt(start))) {
start++;
continue;
}
//判断尾字符是否为有效字符
if (!isValid(s.charAt(end))) {
end--;
continue;
}
//判断首尾两个字符是否相等
if (s.charAt(start) != s.charAt(end)) {
return false;
}
start++;
end--;
}
return true;
}
public static boolean isValid(char c) {
if ((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9')) {
return true;
}
return false;
}
}
.