问题:
验证一个字符串是否是回文字符串,只验证字符串中国的字母和数字,
字母不区分大小写。
解决方式一:
先去除掉字符串中的非字母和非数字,通过reverse()方法逆序得到另一个字符串
,若两个项目则是回文字符串;
代码一:
public boolean judge(String s1){
StringBuffer sber = new StringBuffer();
for(int i=0;i<s1.length;i++){
char c = s1.charAt(i);
if(Character.isLetterOrDigit(c){
sber.append(Character.toLowerCase(c);
}
}
StringBuffer s2 = new StringBuffer(sber).reverse();
return sber.toString().equals(s2.toString());
}
解决方式二:
使用双指针,先刷选出非字母和数字,一个在字符串头部,一个在尾部,
直到两个指针相等;
代码二:
public boolean judge(String s1){
StringBuffer sber = new StringBuffer();
for(int i=0;i<s1.length;i++){
char c = s1.charAt(i);
if(Character.isLetterOrDigit(c){
sber.append(Character.toLowerCase(c);
}
}
int left = 0;
int right = sber.length-1;
while(left<right){
if(Charater.toLowerCase(sber.charAt(left)) != Character.toLowerCase(sber.charAt(right))){
return false;
}
++left;
--right;
}
return true;
}
解决方式三:
双指针,分别在字符串左右,不筛选,直接在原字符串上比较,
遇到非字母和数字,则跳转下一个再比较;
代码三:
public boolean judge(String s1){
StringBuffer sber = new StringBuffer();
int left = 0;
int right = s1-1;
while(left<right){
while(left<right && !Character.isLetterOrDigit(s1.charAt(left))){
++left;
}
while(left<right && !Character.isLetterOrDigit(s1.charAt(right))){
--right;
}
if(left<right){
if(Charater.toLowerCase(sber.charAt(left)) != Character.toLowerCase(sber.charAt(right))){
return false;
}
++left;
--right;
}
}
return true;
}
涉及类和方法:
String.charAt(int i): 取字符串中的某个字符
Chararter.isLetterOrDigit(char c):判断是否是数字或者字母
Character.toLowerCase(char c):把字母全部变为小写
StringBuffer.reverse():把字符串倒序