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