描述
这个题目说的是,给你一个字符串,你要判断它是否是回文字符串。字符串里只考虑字母和数字,其它的字符可以无视。另外,对于字母,可以忽略大小写。
例如:" caa c "就是回文字符串。
注意点
- 判断字符是否是字母和数字
- 非Alphanumeric可忽略
- 对于字母可以忽略大小写
Tips
- 双指针"逼近"
代码引用
/**
* 判断是否是回文字符串
*/
public class isPalindrome {
/**
* 判断字符是否是数字或者字母
*
* @param c 字符
*/
private static Boolean isAlphanumeric(char c) {
return ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= 0 && c <= 9));
}
/**
* 判断两个字母忽略大小写后是否一致
*
* @param a 字母
* @param b 字母
*/
private static Boolean isEqualIgnoreCase(char a, char b) {
if (a >= 'A' && a <= 'Z') a += 32;
if (b >= 'A' && b <= 'Z') b += 32;
return a == b;
}
/**
* 判断是否是回文字符串
* T:O(n^2) S:O(1)
*
* @param s 字符串
*/
public static boolean isPalindrome(String s) {
//边角条件
if (s == null || s.length() == 0) return true;
int i = 0, j = s.length() - 1;
for (; i < j; ++i, --j) { //时刻牢记i<j条件,尤其是内部循环
while (i < j && !isAlphanumeric(s.charAt(i))) i++;
while (i < j && !isAlphanumeric(s.charAt(j))) j--;
if (i < j && !isEqualIgnoreCase(s.charAt(i), s.charAt(j))) return false;
}
return true;
}
public static void main(String[] args) {
System.out.println(isPalindrome(" caa c "));
}
}