680. Valid Palindrome II【easy】
680. Valid Palindrome II【easy】
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.
错误解法:
class Solution {
public:
bool validPalindrome(string s) {
int start = ;
int end = s.length() - ;
int flag = false;
while (start <= end) {
if (s[start] == s[end]) {
++start;
--end;
}
else {
if (!flag) {
flag = true;
if (s[start + ] == s[end]) {
++start;
} else if (s[start] == s[end - ]) {
--end;
} else {
return false;
}
}
else {
return false;
}
}
}
return true;
}
};
没有通过以下测试用例:
"aguokepatgbnvfqmgmlcupuufxoohdfpgjdmysgvhmvffcnqxjjxqncffvmhvgsymdjgpfdhooxfuupuculmgmqfvnbgtapekouga"
考察代码逻辑,发现一开始我们命中了
s[start + 1] == s[end]
这个逻辑,"aguokepatgbnvfqmgmlcupuufxoohdfpgjdmysgvhmvffcnqxjjxqncffvmhvgsymdjgpfdhooxfuupuculmgmqfvnbgtapekouga",并且设置了标志位,这就坑了,下次发现不相等的情况,就直接返回false了。
其实我们本意是要命中下面的逻辑
s[start] == s[end - 1]
"aguokepatgbnvfqmgmlcupuufxoohdfpgjdmysgvhmvffcnqxjjxqncffvmhvgsymdjgpfdhooxfuupuculmgmqfvnbgtapekouga",并且设置了标志位,这样就可以满足测试用例。
就是说每次我们用
s[start + 1] == s[end]
和
s[start] == s[end - 1]
其实是一种“或”的关系,所以我们要一判断就判断到底,比如下面的解法一。
解法一:
class Solution {
public boolean validPalindrome(String s)
{
int left = , right = s.length() - ;
while (left < right)
{
if (s.charAt(left) == s.charAt(right))
{
left++; right--;
}
else
{
//remove right
int templeft = left, tempright = right - ;
while (templeft < tempright)
{
if (s.charAt(templeft) != s.charAt(tempright)) break;
templeft++; tempright--;
if (templeft >= tempright) return true;
}
//remove left
left++;
while (left < right)
{
if (s.charAt(left) != s.charAt(right)) return false;
left++; right--;
}
}
}
return true;
}
}
参考@yashar 的代码。
解法二:
class Solution {
public boolean validPalindrome(String s)
{
return validPalindrome(s, , s.length() - , false);
}
private boolean validPalindrome(String s, int left, int right, Boolean mismatch)
{
if (right < left) return true;
if (s.charAt(left) != s.charAt(right))
{
if (mismatch == true)
return false;
return validPalindrome(s, left, right - , true) || validPalindrome(s, left + , right, true);
}
else
{
return validPalindrome(s, left + , right - , mismatch);
}
}
}
递归,参考@yashar 的代码。
解法三:
class Solution {
public:
bool validPalindrome(string s) {
return valid(s, , s.length() - , );
}
private:
bool valid(string& s, int i, int j, int d) { // d: num of chars you can delete at most
if (i >= j) return true;
if (s[i] == s[j])
return valid(s, i + , j - , d);
else
return d > && (valid(s, i + , j, d - ) || valid(s, i, j - , d - ));
}
};
递归,参考@alexander 的代码。
680. Valid Palindrome II【easy】的更多相关文章
- 680. Valid Palindrome II【Easy】【双指针-可以删除一个字符,判断是否能构成回文字符串】
Given a non-empty string s, you may delete at most one character. Judge whether you can make it a pa ...
- 【Leetcode_easy】680. Valid Palindrome II
problem 680. Valid Palindrome II solution: 不理解判断函数中的节点的问题... class Solution { public: bool validPali ...
- 142. Linked List Cycle II【easy】
142. Linked List Cycle II[easy] Given a linked list, return the node where the cycle begins. If ther ...
- 219. Contains Duplicate II【easy】
219. Contains Duplicate II[easy] Given an array of integers and an integer k, find out whether there ...
- 【LeetCode】680. Valid Palindrome II
Difficulty:easy More:[目录]LeetCode Java实现 Description https://leetcode.com/problems/valid-palindrome ...
- [leetcode]680. Valid Palindrome II有效回文II(可至多删一原字符)
Given a non-empty string s, you may delete at most one character. Judge whether you can make it a pa ...
- [LeetCode] 680. Valid Palindrome II 验证回文字符串 II
Given a non-empty string s, you may delete at most one character. Judge whether you can make it a pa ...
- 【LeetCode】680. Valid Palindrome II 验证回文字符串 Ⅱ(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 双指针 思路来源 初版方案 进阶方案 日期 题目地址 ...
- 491. Palindrome Number【easy】
Check a positive number is a palindrome or not. A palindrome number is that if you reverse the whole ...
随机推荐
- [BZOJ4337][BJOI2015]树的同构(树的最小表示法)
4337: BJOI2015 树的同构 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1023 Solved: 436[Submit][Status ...
- 【状压DP】旅行商问题
给定一张带权有向图,要求从顶点0出发,经过每个结点恰好一次后再返回0,求边权和的最小值. 2<=n<=15 0<=d(i,j)<=1000 样例 5 80 1 30 3 41 ...
- Problem O: 零起点学算法10——求圆柱体的表面积
#include<stdio.h> int main() { float r,h,pi; pi=3.1415926; scanf("%f %f",&r,& ...
- yum出现的“UnicodeDecodeError: 'ascii' codec”问题解决
新装了CentOS 6.5系统,打算使用yum安装程序是出现了如下错误: Loading mirror speeds from cached hostfile Traceback (most rece ...
- css sprite demo
一张图片,用CSS分割成多个小图标. css样式: .icon{ background:url(../images/tabicons.png) no-repeat;width:18px; line-h ...
- iOS应用程序多语言本地化
多语言在应用程序中一般有两种做法:一.程序中提供给用户自己选择的机会:二.根据当前用户当前移动设备的语言自动将我们的app切换对应语言. 第一种做法比较简单完全靠自己的发挥了,这里主要讲第二种做法,主 ...
- 使用FluentValidation来进行数据有效性验证
之前我介绍过了使用系统自带的Data Annotations来进行数据有效性验证,今天在CodePlex上逛的时候,发现了一个非常简洁好用的库:FluentValidation 由于非常简洁,就直接拿 ...
- 基本的Bootstrap模板
<!DOCTYPE html> <html> <html lang="zh-cn"> <meta charset="UTF-8& ...
- 各种Lisp系语言大检阅
主要特色: CommonLISP : lisp系集大成者, 工业化强度的大型语言. 拥有理论上最高的表达力, 非常复杂, 学习难度极大. 喜欢的人捧到天上, 觉得它是一切语言的终点, 不喜欢的人恶心死 ...
- 【Hadoop】HDFS源码解读
1.open流程 2.get DFS流程: 3.获取block信息流程