leetcode-680-Valid Palindrome II
Posted chenjx85
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode-680-Valid Palindrome II相关的知识,希望对你有一定的参考价值。
题目描述:
Given a non-empty string s
, you may delete at most one character. Judge whether you can make it a palindrome.
Example 1:
Input: "aba"
Output: True
Example 2:
Input: "abca"
Output: True
Explanation: You could delete the character ‘c‘.
Note:
- The string will only contain lowercase characters a-z. The maximum length of the string is 50000.
要完成的函数:
bool validPalindrome(string s)
说明:
1、给定一个字符串,至多删去里面的一个字符,使其成为一个回文串。判断能不能实现。
2、我们先看一个例子
abca
acba(反转)
我们可以看到第一个字母是一样的,第二个字母的时候就对不上了,那我们如果要形成一个回文串,可以试着删去第二个字母b,也可以删去从后面数起第二个字母c,只要之后能一一对上,那么还是一个回文串。
关于这两种情况,给两个例子来说明一下:
ececabbacec,这个字符串,我们看到第一个字符e和最后一个字符c没对上,我们可以删去e,这样子能形成回文串。我们也能删去c,但这样形成不了回文串。这是要删去前面字符的例子。
abbca,这个字符串,如果删去前面字符b,那么形成不了回文串,如果删去后面字符c,刚好能形成回文串。这是要删去后面字符的例子。
所以我们要分成两种情况来判断处理。
按照上述逻辑来处理一下,构造如下代码:(附解释)
bool validPalindrome(string s)
{
int i=0,j=s.size()-1;
while(i<j)
{
if(s[i]!=s[j])//当碰到对不上的时候,记录i和j的值
break;
i++;
j--;
}
int i1=i,j1=j;//记录一个副本
i++;//如果删去前面的字符,i++,处理下一个
bool flag=1;
while(i<j)
{
if(s[i]!=s[j])//如果出现第二次对不上的情况
{
flag=0;
break;
}
i++;
j--;
}
if(flag==1)//如果全程都对得上,那么返回true
return true;
j1--;//如果删去前面的字符对不上了,那么删去后面的字符试试
while(i1<j1)
{
if(s[i1]!=s[j1])//如果还是对不上,返回false
return false;
i1++;
j1--;
}
return true;//如果全程对得上,那么返回true
}
上述代码实测119ms,beats 90.33% of cpp submissions。
以上是关于leetcode-680-Valid Palindrome II的主要内容,如果未能解决你的问题,请参考以下文章
[leetcode-680-Valid Palindrome II]
Leetcode 680: Valid Palindrome II
leetcode-680-Valid Palindrome II
Python 解LeetCode:680. Valid Palindrome II