题目:Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.
翻译 :给定一个字符串,判断它是否回文,只考虑数字字母字符并忽略大小写。
比如:“A man, a plan, a canal: Panama” is a palindrome.
而"race a car" is not a palindrome.
其实就是正着读和反着读一样
备注:面试者可以会问这样的问题:
问:空字符串算是回文字符串吗?
答:在这个问题里,我们将空字符串运定义为回文字符串。
先考虑符合大小写和符号相同原则的情况下回文的代码!
//判断是否为回文字符串,其中考虑了大小写和符号(需要完全一致)
public class Palindrome {
public static void main(String[] args) {
String s1 = "A man, a plan, a canal: Panama";
String s = "abcdedcba";
boolean bo = isPalindrome(s);
System.out.println(bo);
}
private static boolean isPalindrome(String s) {
int N = s.length();
for (int i = 0; i < N; i++) {
if(s.charAt(i) == s.charAt(N-1-i)) {
return true;
}
return false;
}
return false;
}
}
但是,如果跳过非字母和非数字字符,则应使用 Character. isLetterOrDigit( ) 方法。
不区分大小写,所以都转化为小写来判断是否相等,用到了 Character.toLowerCase( ) 方法。
JDK1.8中
static int toLowerCase(int codePoint)
使用UnicodeData文件中的大小写映射信息将字符(Unicode代码点)参数转换为小写
static boolean isLetterOrDigit(char ch)
确定指定的字符是字母还是数字,返回true ,字符被认为是字母或数字。
public class Palindrome {
public static void main(String[] args) {
String s = "A man, a plan, a canal: Panama";
String s1 = "abcdedcba";
boolean bo = isPalindrome(s);
System.out.println(bo);
}
private static boolean isPalindrome(String s) {
int start = 0;
int end = s.length()-1;
while (start <= end) {
while(!Character.isLetterOrDigit(s.charAt(start))) {
start ++;
}
while(!Character.isLetterOrDigit(s.charAt(end))) {
end --;
}
if (Character.toLowerCase(s.charAt(start)) != Character.toLowerCase(s.charAt(end))) {
return false;
}
start ++;
end --;
}
return true;
}
}
容易出错的的地方
while(!Character.isLetterOrDigit(s.charAt(start))) {
start ++;
}
while(!Character.isLetterOrDigit(s.charAt(end))) {
end --;
}
应该写成循环而不是判断