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 ...
随机推荐
- 前端基础-JavaScript的基本概述和语法
1.JavaScript概述 2.JavaScript引入方式 3.JavaScript语言规范 4.JavaScript语言基础 5.JavaScript数据类型 6.JavaScript运算符 7 ...
- [CF911G]Mass Change Queries
题目大意: 给你一个长度为n的数列a,按顺序进行以下m次操作,每次将区间[l,r]中的所有x变成y,问最后数列是怎样的. 思路: 线段树. 每个线段树结点上维护当前区间每个数分别会变成多少.时间复杂度 ...
- ToggleButton控件,Switch控件
(一) 1.效果图 2. activity_main.xml <?xml version="1.0" encoding="utf-8"?> & ...
- android连接Mysql数据库之JDBC方式
一.创建一个数据库和若干表,并导入相关信息.这里以我之前使用的一个图书系统的数据库为例子. 首先假设已经安装并配置好Mysql.(建议大家安装WAMP,也就是安装完这个,就相当于安装了Mysql,PH ...
- Android2017进阶知识点、面试题及答案(精选版)
前言 没啥好说的,撸起袖子就是干吧! 1 2 JAVA 相关 1.静态内部类.内部类.匿名内部类,为什么内部类会持有外部类的引用?持有的引用是this?还是其它? 静态内部类:使用static修饰的内 ...
- flask-assets使用介绍
作用:对css.js静态文件进行打包,打包成一个文件,然后去除文件里的换行.空行等进行压缩: 而且 Flask-Assets 还会使用特定的 HTTP Response Header, 让浏览器缓存这 ...
- javascript快速入门2--变量,小学生数学与简单的交互
变量 对于变量的理解:变量是数据的代号.如同人的名字一样. var num;//在JavaScript中使用关键字var声明一个变量 在JavaScript中,使用上面的语法,就可以声明一个变量,以便 ...
- 我为什么学习Windows编程
前一段时间在看TCP/IP,在图书馆里面找了不少的书,其中有几本书还是不错的.比如: <Windows网络与通信程序设计(第二版)> 王艳平著 <WinSock网络编程经络> ...
- docker入门——镜像简介
什么是docker镜像 Docker镜像是由文件系统叠加而成. 最底端是一个引导文件系统,即bootfs: 这很像典型的Linux/Unix的引导文件系统.Docker用户几乎永远不会和引导文件系统有 ...
- Rails生成随机字符串及加解密
1.生成安全的base64字符串 key = SecureRandom.urlsafe_base64