每日一题算法:2020年6月19日 验证回文串 isPalindrome

2020年6月19日 验证回文串 isPalindrome

每日一题算法:2020年6月19日 验证回文串 isPalindrome_第1张图片

默认格式:

class Solution {
    public boolean isPalindrome(String s) {

    }
}

解题思路:

这道题也没啥复杂的,也想不到什么取巧的。一般来说这种回文有两种解决思路,用栈,根据字符串的长度n入栈n/2个元素。

但是在这道题中不太适用,因为会有标点符号来干扰长度,所以这里使用另一种双指针的算法,从头部和尾部向中间开始收缩,直到首尾坐标相等。

奇葩的错误:
每日一题算法:2020年6月19日 验证回文串 isPalindrome_第2张图片

本来挺简单的一道题目,因为要考虑许多特殊的情况,所以错了好多次,都是没有想到一些细节的部分。

比如上面这个地方,他是0而不是O,然后我仔细看了题目才发现,数字也是属于计算的范围内的。重新给字符增加约束。
每日一题算法:2020年6月19日 验证回文串 isPalindrome_第3张图片

 public boolean isPalindrome(String s) {

            //算了,直接开外挂
            s=s.toUpperCase();
            char[] chars=s.toCharArray();

            //双指针,起点是0,终点是尾部
            int start=0;
            int end=chars.length-1;

            //加一个限制条件判断,要求字符串必须存在至少一个字符,没有字符直接返回true
            int i;
            for (i=start;i<=end&&!((chars[i]<=90&&chars[i]>=65)||(chars[start]>=48&&chars[start]<=57));i++){
            }
            if (i==end+1)
                return true;
            //循环条件,起点小于终点的位置
            for(;start<end;){
                    //获取一个头部非标点的字符,所以循环删除前面若干个非字符
                    if (!((chars[start]<=90&&chars[start]>=65)||(chars[start]>=48&&chars[start]<=57))){
                        start++;
                        continue;
                    }
                    //同理,获得尾部的一个字符
                    if (!((chars[end]<=90&&chars[end]>=65)||(chars[end]>=48&&chars[end]<=57))){
                        end--;
                        continue;
                    }

                    if (chars[start]==chars[end]){
                        //移动指针,开始判断下一个
                        start++;
                        end--;
                        continue;
                    }
                    return false;
            }
            return true;
        }

主要是有点坑,简单还是挺简单的

你可能感兴趣的:(每日一题算法)