题目描述:
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1: 输入: "A man, a plan, a canal: Panama" 输出: true 示例 2: 输入: "race a car" 输出: false
一种解法是将字符串的有效字符存入数组中,再去比较
1 class Solution { 2 public boolean isPalindrome(String s) { 3 4 int index=0; 5 char t; 6 char[] arr=new char[s.length()]; 7 for(int i=0;i<s.length();i++){ 8 t=s.charAt(i); 9 if((t<=‘z‘&&t>=‘a‘)||(t<=‘Z‘&&t>=‘A‘)||(t>=‘0‘&&t<=‘9‘)) 10 arr[index++]=t; 11 } 12 if(index==0)return true; 13 14 for(int i=0;i<index/2;i++){ 15 if(arr[i]>‘9‘&&arr[index-1-i]>‘9‘) { 16 if(arr[i]!=arr[index-1-i]&&arr[i]!=(arr[index-1-i]+32)&&arr[i]!=(arr[index-1-i]-32)) 17 return false; 18 } 19 else { 20 if(arr[i]!=arr[index-1-i]) 21 return false; 22 } 23 } 24 25 26 return true; 27 } 28 }
提交记录中最快的(2ms):从两头开始遍历找有效字符进行比较
class Solution { public boolean isPalindrome(String s) { if(s == null || s=="") return true; char[] chs = s.toCharArray(); int l = 0; int r = chs.length - 1; all : while(l < r){ //找左边第一个未用过的有效字符 while(chs[l]<‘0‘|| chs[l]>‘z‘||(chs[l]>‘Z‘&&chs[l]<‘a‘)||(chs[l]>‘9‘&&chs[l]<‘A‘)){ l++; if(l>=r) break all; } //找右边第一个未用过的有效字符 while(chs[r]<‘0‘|| chs[r]>‘z‘||(chs[r]>‘Z‘&&chs[r]<‘a‘)||(chs[r]>‘9‘&&chs[r]<‘A‘)){ r--; if(l>=r) break all; } if(chs[l] == chs[r] || (Math.abs(chs[l]-chs[r])==32&&chs[l]>=‘A‘)){ l++; r--; }else{ return false; } } return true; } }
原文地址:https://www.cnblogs.com/hzhqiang/p/10859876.html
时间: 2024-11-07 05:56:54