[LeetCode] Valid Palindrome II 验证回文字符串之二
2017-10-02 08:17
459 查看
Given a non-empty string
Example 1:
Example 2:
Note:
The string will only contain lowercase characters a-z.
The maximum length of the string is 50000.
这道题是之前那道Valid Palindrome的拓展,还是让我们验证回复字符串,但是区别是这道题的字符串中只含有小写字母,而且这道题允许删除一个字符,那么当遇到不匹配的时候,我们到底是删除左边的字符,还是右边的字符呢,我们的做法是两种情况都要算一遍,只要有一种能返回true,那么结果就返回true。我们可以写一个子函数来判断字符串中的某一个范围内的子字符串是否为回文串,参见代码如下:
解法一:
下面这种写法跟上面的解法思路一样,只不过没有写额外的函数,还是要遍历两种情况,参见代码如下:
解法二:
类似题目:
Valid Palindrome
参考资料:
https://discuss.leetcode.com/topic/103939/java-o-n-time-o-1-space
https://discuss.leetcode.com/topic/103911/two-solutions-optimized-and-recursive-java-and-c
LeetCode All in One 题目讲解汇总(持续更新中...)
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.
这道题是之前那道Valid Palindrome的拓展,还是让我们验证回复字符串,但是区别是这道题的字符串中只含有小写字母,而且这道题允许删除一个字符,那么当遇到不匹配的时候,我们到底是删除左边的字符,还是右边的字符呢,我们的做法是两种情况都要算一遍,只要有一种能返回true,那么结果就返回true。我们可以写一个子函数来判断字符串中的某一个范围内的子字符串是否为回文串,参见代码如下:
解法一:
class Solution { public: bool validPalindrome(string s) { int left = 0, right = s.size() - 1; while (left < right) { if (s[left] != s[right]) return isValid(s, left, right - 1) || isValid(s, left + 1, right); ++left; --right; } return true; } bool isValid(string s, int left, int right) { while (left < right) { if (s[left] != s[right]) return false; ++left; --right; } return true; } };
下面这种写法跟上面的解法思路一样,只不过没有写额外的函数,还是要遍历两种情况,参见代码如下:
解法二:
class Solution { public: bool validPalindrome(string s) { int left = 0, right = s.size() - 1; while (left < right) { if (s[left] == s[right]) { ++left; --right; } else { int l = left, r = right - 1; while (l < r) { if (s[l] != s[r]) break; ++l; --r; if (l >= r) return true; } ++left; while (left < right) { if (s[left] != s[right]) return false; ++left; --right; } } } return true; } };
类似题目:
Valid Palindrome
参考资料:
https://discuss.leetcode.com/topic/103939/java-o-n-time-o-1-space
https://discuss.leetcode.com/topic/103911/two-solutions-optimized-and-recursive-java-and-c
LeetCode All in One 题目讲解汇总(持续更新中...)
相关文章推荐
- LeetCode 680. Valid Palindrome II (验证回文字符串 Ⅱ)
- LeetCode 125. Valid Palindorme (验证回文字符串)
- Leetcode-680. Valid Palindrome II(判断回文)
- [LeetCode] 680. Valid Palindrome II 验证回文字符串 II
- Palindrome Partitioning&II(回文字符串)
- leetcode_java.T020_ValidParentheses 给定一个只包含(‘, ‘)’, ‘{‘, ‘}’, ‘[’ 和‘]’的字符串,验证它是否是有效的。
- LeetCode Valid Palindrome II
- 分割成回文需要的最小分割数 Palindrome Partitioning II @LeetCode
- LeetCode 132. Palindrome Partitioning II(回文切分)
- valid-palindrome——判断带符号数字字母的字符串是否为回文
- leetcode -day13 Valid Palindrome & Triangle & Pascal's Triangle I II
- [LeetCode] Valid Parenthesis String 验证括号字符串
- [LeetCode] Palindrome Permutation II 回文全排列之二
- leetcode 680 Valid Palindrome II
- Palindrome Partitioning II(找给定字符串分割次数获取回文字串, 动态规划)
- leetcode:字符串之Valid Palindrome && Palindrome Number
- [LeetCode]—Palindrome Partitioning II 回文分割,求最小分割数
- 【leetcode】680. Valid Palindrome II(Python & C++)
- leetcode(valid-palindrome)判断字符串是否是对称
- LeetCode-Palindrome Partitioning II-回文分割-DP优化