125验证回文串

Algorithm

【leetcode】125验证回文串

https://leetcode.com/problems/valid-palindrome/

1)problem

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

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

示例 1:

输入: "A man, a plan, a canal: Panama"
输出: true
示例 2:

输入: "race a car"
输出: false

2)answer

1、普通思路

把数字和字符提取出来,然后如果是字母就转换为小写。加到新的字符串中。

对于这个新的字符串,使用一个多条件循环,分别从字符串头、字符串尾遍历字符串的中间值,如果不一致就退出。直到遍历结束还是一致就判定为回文字符串。

2、高级思路

在discuss看到的答案。

用一个大循环分别从字符串头、字符串尾遍历字符串的中间值,里面两个小循环,用isalnum()函数判断是不是字母数字,如果不是就向前移动指针。

https://leetcode.com/problems/valid-palindrome/discuss/119173/C++-Easy-to-Understand-Solution

3)solution

第一种方案:

先判断是否为数字字母,跟之前写的to-lower-case结合,把大写转换为小写。

#include<stdio.h>
#include <string>
using std::string;

class Solution {
public:
    bool isPalindrome(string s) {

        string re_val = "";
        // 除去特殊符号,提取出字符串的小写字母
        for (char str_val : s)
        {
            // 确认字母数字
            if (isalnum(str_val) != false)
            {
                if (str_val >= 'A'&& str_val <= 'Z')
                {
                    // 取小写与大写之间的差值,得到字符对应的小写ASCII码对应是什么存进字符串中
                    re_val += (str_val + ('a' - 'A'));
                }
                else
                {
                    // 如果是小写就不处理
                    re_val += str_val;
                }
            }
        }
        for (int i=0,j=re_val.size()-1; i<j;i++,j--) 
        {
            //一个指针从左边指到右边,一个指针从右边指向左边。如果有不同的值,就判断不是回文字符。
            if (re_val[i] != re_val[j])
                return false;
        }
        return true;
    }
};


int main()
{

    Solution solu;
    bool ret;
    ret = solu.isPalindrome("A man, a plan, a canal: Panama");
    printf("%d \n", ret);
    ret = solu.isPalindrome("race a car");
    printf("%d \n", ret);
    return 0;
}

第二种方案:

扫描二维码关注公众号,回复: 5155515 查看本文章
bool isPalindrome(string s) {
    for (int i = 0, j = s.size() - 1; i < j; i++, j--) { // Move 2 pointers from each end until they collide
        while (isalnum(s[i]) == false && i < j) i++; // Increment left pointer if not alphanumeric
        while (isalnum(s[j]) == false && i < j) j--; // Decrement right pointer if no alphanumeric
        if (toupper(s[i]) != toupper(s[j])) return false; // Exit and return error if not match
    }
    
    return true;
}

猜你喜欢

转载自www.cnblogs.com/17bdw/p/10358170.html