680.验证回文串II

  1. 680.验证回文串II
    1. 680.1 题目
    2. 680.2 题解
      1. 封装后双指针
    3. 680.3 代码
    4. 680.4 运行结果

680.验证回文串II


680.1 题目

给你一个字符串 s,最多可以从中删除一个字符。

请你判断 s 是否能成为回文字符串:如果能,返回 true;否则,返回 false

示例 1:

输入:s = "aba"
输出:true

示例 2:

输入:s = "abca"
输出:true
解释:你可以删除字符 ‘c’ 。

示例 3:

输入:s = "abc"
输出:false

提示:

  • 1 <= s.length <= 10^5
  • s 由小写英文字母组成

680.2 题解

封装后双指针

// 方法一:封装后双指针
// 封装判断是否是回文串的方法
// 两端向中间遍历字符串
// 遇到不相等的字符尝试删除左边或右边的字符,判断剩下的部分是否为回文字符串
static bool CanBePalindrome1(string s)
{
    // 初始化左右指针,左指针指向字符串开头,右指针指向字符串结尾
    int left = 0, right = s.Length - 1;

    // 从两端向中间遍历字符串
    while (left < right)
    {
        // 如果遇到不相等的字符
        if (s[left] != s[right])
        {
            // 尝试删除左边或右边的字符,判断剩下的部分是否为回文字符串
            return IsPalindrome(s, left + 1, right) || IsPalindrome(s, left, right - 1);
        }

        // 移动左指针向右移动一位,右指针向左移动一位
        left++;
        right--;
    }

    // 如果所有字符都匹配,说明字符串本身就是回文字符串
    return true;
}

// 判断指定范围内的字符串是否为回文字符串
static bool IsPalindrome(string s, int left, int right)
{
    // 使用双指针,从指定范围的两端向中间遍历字符串
    while (left < right)
    {
        // 如果两端的字符不相等,则不是回文字符串
        if (s[left] != s[right])
        {
            return false;
        }

        // 移动左指针向右移动一位,右指针向左移动一位,继续检查下一对字符
        left++;
        right--;
    }

    // 如果整个范围内的字符都匹配,说明是回文字符串
    return true;
}

680.3 代码

using System;

class Program
{
    static void Main()
    {
        #region 题目

        // 给你一个字符串 s,最多可以从中删除一个字符。
        // 请你判断 s 是否能成为回文字符串:如果能,返回 true ;否则,返回 false 。

        // 示例 1:
        // 输入:s = "aba"
        // 输出:true

        // 示例 2:
        // 输入:s = "abca"
        // 输出:true
        // 解释:你可以删除字符 'c' 。

        // 示例 3:
        // 输入:s = "abc"
        // 输出:false

        // 提示:
        // 1 <= s.length <= 105
        // s 由小写英文字母组成

        #endregion

        #region 测试

        // 示例 1
        string str1 = "aba";
        bool result1_1 = CanBePalindrome1(str1);
        Console.WriteLine($"示例1 方法1 输出:{result1_1}");

        // 示例 2
        string str2 = "abca";
        bool result2_1 = CanBePalindrome1(str2);
        Console.WriteLine($"示例2 方法1 输出:{result2_1}");

        // 示例 3
        string str3 = "abc";
        bool result3_1 = CanBePalindrome1(str3);
        Console.WriteLine($"示例3 方法1 输出:{result3_1}");

        #endregion
    }

    #region 答案

    // 方法一:双指针
    // 封装判断是否是回文串的方法
    // 两端向中间遍历字符串
    // 遇到不相等的字符尝试删除左边或右边的字符,判断剩下的部分是否为回文字符串
    static bool CanBePalindrome1(string s)
    {
        // 初始化左右指针,左指针指向字符串开头,右指针指向字符串结尾
        int left = 0, right = s.Length - 1;

        // 从两端向中间遍历字符串
        while (left < right)
        {
            // 如果遇到不相等的字符
            if (s[left] != s[right])
            {
                // 尝试删除左边或右边的字符,判断剩下的部分是否为回文字符串
                return IsPalindrome(s, left + 1, right) || IsPalindrome(s, left, right - 1);
            }

            // 移动左指针向右移动一位,右指针向左移动一位
            left++;
            right--;
        }

        // 如果所有字符都匹配,说明字符串本身就是回文字符串
        return true;
    }

    // 判断指定范围内的字符串是否为回文字符串
    static bool IsPalindrome(string s, int left, int right)
    {
        // 使用双指针,从指定范围的两端向中间遍历字符串
        while (left < right)
        {
            // 如果两端的字符不相等,则不是回文字符串
            if (s[left] != s[right])
            {
                return false;
            }

            // 移动左指针向右移动一位,右指针向左移动一位,继续检查下一对字符
            left++;
            right--;
        }

        // 如果整个范围内的字符都匹配,说明是回文字符串
        return true;
    }

    #endregion
}

680.4 运行结果

示例1 方法1 输出:True
示例2 方法1 输出:True
示例3 方法1 输出:False


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏