持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第30天,点击查看活动详情
前言
题目来源
题目介绍
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明: 本题中,我们将空字符串定义为有效的回文串。
题目分析
首先应该知道什么是回文串
“回文串”是一个正读和反读都一样的字符串,初始化标志flag=true,比如“level”或者“noon”等等就是回文串。
题目告知应忽略字符空格和字母大小写,验证回文串,把字符串转成字符数组,那么这个数组应该从下标0开始往后的元素和下标从最大值开始后往前的元素值应该一样。因此采用双指针解法。
题目解答
class Solution {
public boolean isPalindrome(String s) {
//把字符串 转为小写
String str = s.toLowerCase();
//把字符串转化为一个数组
char[] chars = str.toCharArray();
//起始位置下标
int l=0;
//尾部位置下标
int r=chars.length-1;
//只要起始位置下标小于右边位置下标 就执行
while (l<r){
//先遍历左边位置是不是字母或者数组
while (!Character.isLetter(chars[l])
&&!Character.isDigit(chars[l])){
l++;
if (l==chars.length-1) return true; //如果全部都是符号,返回true
}
//判断右边位置是不是字母或者数字
while (r>0&&!Character.isLetter(chars[r])&&!Character.isDigit(chars[r])){
r--;
}
//存在字母和数字,比较左边和右边 位置 元素,如果不等 肯定是false
if (chars[l]!=chars[r]) return false;
//递增一个
l++;
//递减一个,保证对比位置是左边第一个等于右边第一个
r--;
}
return true;
}
}
先对左边和右边元素 做判断,依次左边和右边对比,直到2边位置下标位置不满足l<r,退出循环。如果都满足chars[l]=chars[r] 那么肯定是回文串了。执行如下
官方答案验证
class Solution {
public boolean isPalindrome(String s) {
StringBuffer sgood = new StringBuffer();
int length = s.length();
for (int i = 0; i < length; i++) {
char ch = s.charAt(i);
if (Character.isLetterOrDigit(ch)) {
sgood.append(Character.toLowerCase(ch));
}
}
StringBuffer sgood_rev = new StringBuffer(sgood).reverse();
return sgood.toString().equals(sgood_rev.toString());
}
}
官方这种比较取巧了,用了字符串的一些api,把字符串翻转,和最先的字符串比较 是否相等一目了然,这种确实很方便哈。
总结
原来这样的字符串叫回文串,我也是才知道有这个名称哈,相对来说是比较好理解的,从数组角度出发,可以很快证明一个字符串是不是一个回文串。