[LeetCode] 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:

    1. 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;
    }
};

参考资料:

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

本文转自博客园Grandyang的博客,原文链接:[LeetCode] Valid Palindrome II 验证回文字符串之二

,如需转载请自行联系原博主。

时间: 2024-09-13 11:00:08

[LeetCode] Valid Palindrome II 验证回文字符串之二的相关文章

[LeetCode] Largest Palindrome Product 最大回文串乘积

Find the largest palindrome made from the product of two n-digit numbers. Since the result could be very large, you should return the largest palindrome mod 1337. Example: Input: 2 Output: 987 Explanation: 99 x 91 = 9009, 9009 % 1337 = 987 Note: The

LeetCode 9 Palindrome Number (回文数)

翻译 确定一个整数是否是回文数.不能使用额外的空间. 一些提示: 负数能不能是回文数呢?(比如,-1) 如果你想将整数转换成字符串,但要注意限制使用额外的空间. 你也可以考虑翻转一个整数. 然而,如果你已经解决了问题"翻转整数(译者注:LeetCode 第七题), 那么你应该知道翻转的整数可能会造成溢出. 你将如何处理这种情况? 这是一个解决该问题更通用的方法. 原文 Determine whether an integer is a palindrome. Do this without ex

leetcode 5 Longest Palindromic Substring--最长回文字符串

问题描述 Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的.比如"a" , "aaabbaaa" 之前

[LeetCode] Valid Parenthesis String 验证括号字符串

Given a string containing only three types of characters: '(', ')' and '*', write a function to check whether this string is valid. We define the validity of a string by these rules: Any left parenthesis '(' must have a corresponding right parenthesi

PHP判断一个字符串是否是回文字符串的方法

 这篇文章主要介绍了PHP判断一个字符串是否是回文字符串的方法,实例分析了php操作字符串判断回文的技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了PHP判断一个字符串是否是回文字符串的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <?php function ishuiwen($str){ $len=strlen($str); $l=1;

c 回文字符串-用c语言判断输入字符串是不是回文字符串

问题描述 用c语言判断输入字符串是不是回文字符串 输入的字符串可能有空格,要求输入 一个数,表示要输入几组数据,然后输入字符串: 若是回文字符串,则输出yes,否则输出no: 例如 3 qwe abba ds ds no yes no 求代码.. 初学C这问题想了很久,求帮忙.. 解决方案 你可以用两个指针,分别指向字符串的头和尾,依此移动来比较,如果相同则yes,否则no

回文字符串实现

一个整数,前后对称称为回文数,比如11211是回文数,12321是回文数.那么回文字符串也是同样的道理,strrts是回文字符串,heleh是回文字符串. 我们就可以来实现下它,非常的简单. #include <stdio.h> #include <string.h> /* *date:2016.10.14 *author:y.x.yang * */ int HuiwenStr(char *str) { //定义两个指针,s1指向字符串str的首个字符,s2指向字符串str的倒数第

NYOJ&amp;#160;回文字符串

回文字符串 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba".当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串.现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串. 输入 第一行给出整数N(0 接下来的N行,每行一个字符串,每个字符串长度不超过1000. 输出 每行输出所需添加的最少字符数 样例输入 1 Ab3b

C/C++开发应用:回文字符串

回文:回文就是正读反读都一样的字符串,例如:"radar","able was i ere i saw elba" 和 "a man a plan a canal panama"(如果忽略空格) . 请编写递归函数testPalindrome,在数组中的字符串为回文时返回true,否则返回false. 函数忽略字符串中的空格和标点符号. #include <stdio.h> /* 字符串 一半数 总个数*/ int charf(cha