相似题目:
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.
For example,"A man, a plan, a canal: Panama"
is a palindrome."race a car"
is not a palindrome.
Note:
Have you consider that the string might be empty? This is a good question to ask during an interview.
For the purpose of this problem, we define empty string as valid palindrome.
问题描述:给出一个字符串,判断是否为回文,只考虑数字和字符,并且忽略大小写。注意:你考虑到空字符串了吗?这是一个你面试时可以向考官提问的好问题。在这里,我们认为空字符串也是回文。
问题解决:首先将原来字符串预处理,将无关的标点符号去除,并且全部大写转化为小写;得出字符串的总长度,分偶数跟奇数两种情况处理。分别用第一个vs最后一个,第二个vs倒数第二个,……这样一次比较,判断是否为回文。
代码如下:
public class Solution { public boolean isPalindrome(String s) { if(s==null) return true; if(s.length()==0) return true; s = s.toLowerCase(); char[] ch = s.toCharArray(); ArrayList<Character> l = new ArrayList<Character>(); for(int i=0; i<ch.length; i++){ if(ch[i]>='a' && ch[i]<='z' || ch[i]>='0'&&ch[i]<='9'){ l.add(ch[i]); } } if(l.size()==0) return true; int r = l.size()%2; int t = l.size()/2; if(r==0){ //是偶数 if(!l.get(t-1).equals(l.get(t))) return false; else{ for(int i=0; i<t-1; i++){ if(!l.get(i).equals(l.get(l.size()-i-1))) return false; } return true; } } else{ //是奇数 for(int i=0; i<t; i++){ if(!l.get(i).equals(l.get(l.size()-i-1))) return false; } return true; } } }
解法二:可以看到,在上面的解法中使用了数组,ArrayList等额外空间,时间复杂度为O(n),空间复杂度为O(n)。一种改进的方法是直接在原来字符串上操作,一个首指针,一个尾指针,如果当前所指是字母或者数字,则比较并移动,如果最后可以重合,则该字符串是回文。
public class Solution { public boolean isValid(char c){ if(c<='z'&&c>='a' || c>='0'&&c<='9') return true; else return false; } public boolean isPalindrome(String s) { if(s==null) return true; if(s.length()==0) return true; s = s.toLowerCase(); char[] ch = s.toCharArray(); int i = 0, j = ch.length-1; while(i!=j&&i<=ch.length-1&&j>=0){ if(isValid(ch[i])&&isValid(ch[j])){ if(ch[i]!=ch[j]) return false; i++; j--; } else if(!isValid(ch[i])) i++; else if(!isValid(ch[j])) j--; else{ i++; j--; } } return true; } }