1. 程式人生 > 其它 >刷題-力扣-680. 驗證迴文字串 Ⅱ

刷題-力扣-680. 驗證迴文字串 Ⅱ

680. 驗證迴文字串 Ⅱ

題目連結

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/valid-palindrome-ii
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

題目描述

給定一個非空字串s,最多刪除一個字元。判斷是否能成為迴文字串。

示例 1:

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

示例 2:

輸入: s = "abca"
輸出: true
解釋: 你可以刪除c字元。

示例 3:

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

提示:

  • 1 <= s.length <= 105
  • s 由小寫英文字母組成

題目分析

  1. 根據題目描述判斷一個字串最多刪除一個字元的情況下是否可以構成迴文串
  2. 雙指標left=0,right=s.length(),從兩側判斷字元是否相等
  3. 當s[left]!=s[right]時,要刪除left或right位置的字元(此時需要left++或right--),再判斷left和right中間的字串是否構成迴文串

程式碼

class Solution {
public:
    bool validPalindrome(string s) {
        int left = 0;
        int right = s.length() - 1;
        while (left < right) {
            if (s[left] != s[right]) {
                return check(s, left, right - 1) || check(s, left + 1, right);
            } else {
                ++left;
                --right;
            }
        }
        return true;
    }

private:
    bool check(std::string& s, int left, int right) {
        while (left < right) {
            if (s[left++] != s[right--]) { return false; }
        }
        return true;
    }
};