[LeetCode] 验证回文字符串

验证回文字符串


125. 验证回文字符串

难度:Easy

题目描述:

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

说明:本题中,我们将空字符串定义为有效的回文串。

示例 1:
输入: “A man, a plan, a canal: Panama”
输出: true

示例 2:
输入: “race a car”
输出: false

解题思路:

  • isnum() 判断是否为数字
  • isalpha() 判断是否为字母
  • isalnum() 判断是否为数字或字母
    首尾双指针遍历,除掉无用的字符,判断对应的字符是否相同。
class Solution {
public:
    bool isPalindrome(string s) {
        for(int i = 0, j = s.size() -1; i < j; i++, j--){
            while(!isalnum(s[i]) && i < j){     // 跳过非有效字符
                i++;
            }
            while(!isalnum(s[j]) && i < j){
                j--;
            }
            if(toupper(s[i]) != toupper(s[j])){
               return false; 
            }
        }
        
        return true;
    }
};

680. 验证回文字符串

难度:Easy (贪心)

题目描述:

给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。

示例 1:
输入: “aba”
输出: True

示例 2:
输入: “abca”
输出: True
解释: 你可以删除c字符。

注意:
字符串只包含从 a-z 的小写字母。字符串的最大长度是50000。

解题思路:

额外添加一个函数判断当前字符串是否为回文串。
采用贪心的策略。
当当前字符串首尾不相同时,判断[low + 1, high], [low, high - 1]是否为回文串。

class Solution {
public:
    // 判断是否为回文串
    bool checkPalindrome(const string& s, int low, int high){
        for (int i = low, j = high; i < j; i++, j--)
        {
            if (s[i] != s[j])
            {
                return false;
            }    
        }

        return true; 
    };

    // 贪心法:递归主函数
    bool validPalindrome(string s) {
        int low = 0, high = s.size() - 1;
        while (low < high)
        {
            if(s[low] == s[high]){
                ++low;
                --high;
            }else
            {
                return checkPalindrome(s, low + 1, high) || checkPalindrome(s, low, high - 1);
            }  
        }

        return true;
    }
};

你可能感兴趣的:(LeetCode,leetcode)