每日一题算法:2020.05.19验证回文字符串validPalindrome

本文探讨了如何验证回文字符串的问题,首先尝试使用栈来解决,但遇到无法判断错误位置的情况。接着转向贪心算法,假设左边部分正确,如果右边出现不匹配则视为右边错误,若连续两次右边错误再检查左边。在代码实现中注意了遍历次数和错误判断时的变量控制。尽管遇到内存消耗问题,但发现官方答案也采用了贪心算法,证明训练有所成效。
摘要由CSDN通过智能技术生成

2020.05.19验证回文字符串

在这里插入图片描述

默认格式:

class Solution {
    public boolean validPalindrome(String s) {

    }
}

思路:

用栈,先压入一半的字符进栈,然后依次出栈,判断每次出栈是否相等,如果相等则进行下一个的判断,如果不相等则把当前值和下一个值进行对比,找出错误的那个…等一下,如果是这种情况[a,b,c,a],压入一半是ab,和ca进行对比的时候无法判断a和c那个是正确的。放弃该思路。

思路2

贪心算法,我不知道是不是可以这么说,因为如果出现不同,区分是左边的错了还是右边的错了太麻烦了,所以直接默认左边的是对的,如果右边的不一样,认为是右边的错了,如果右边的错了两次,再判断是否是左边错了。

如果左边也错了两次,再返回false

代码实现:

实际的测试过程中有一些变量细节控制不到位,比如遍历的次数(l+1)/2和每次判断错误时的i–;来保证对一个元素再次判断。

    public boolean validPalindrome(String s) {
        int l=s.length();
        int x=1;
        //循环一半的长度,认为左边是正确的,如果两边不同,那么是右边出错了
        //(l+1)/2,当长度为奇数时,需要判断的是0-长度的一半,判断长度的一半+1
        for (int i = 0; i < (l+1)/2; i++)
        {
            //左右对称的是否相等,如果相等则不计算,如果不相等,则计数+1,当计数为2时再次出错则认为是有错误,从左边计算不是回文
            //i--是为了在右边和左边不相等的时候,把左边的左边的当前值再比较一次
            if(s.charAt(i)!=s.charAt(l-i-x)) {
                x++;
                i--;
                if (x == 3)
                    break;
            }
        }
        //如果左边的循环结束时,计数为1或者2,则认为左边能够形成回文
        if (x==1||x==2)
            return true;
        //x置为0
        x=0;
        //对右边进行判断,如果右边也不能通过,则认为确实无法形成回文
        for (int i = 0; i < (l+1)/2; i++)
        {
            if(s.charAt(i+x)!=s.charAt(l-i-1)){
                x++;
                i--;
                if (x==2)
                    return false;
            }
        }
        return  true;
    }

还有,我发现了一个bug,为什么我每次提交消耗内存都是40M上下,这怎么消耗40M的内存嘛。
在这里插入图片描述

今天非常高兴,查看了解题答案发现官方用的也是贪心算法,但是细节处理上比我更好。这证明这几天的训练还是有些效果的,虽然这次的题目是简单的难度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值