Leetcode 初级算法:字符串5. 验证回文字符串

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

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

示例 1:

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

输入: “race a car”
输出: false

第一遍做题时没有注意到其中还可能含有数字,把数字全部去掉了导致无法通过
代码如下吸取教训:

```cpp
class Solution {
public:
    bool isPalindrome(string s) {
        vector<char> world;
        int n=0,a[26];
        memset(a,0,sizeof(a));
        for(int i=0;i<s.length();i++){
            if(isupper(s[i])){//大写转化成小写
                s[i] = tolower(s[i]);
            }
            if(s[i]>='a' && s[i]<='z'){//将所有字母转倒world中
                world.push_back(s[i]);
            }
        }
        for(int j=0;j<world.size();j++){
        a[world[j]-'a']++;//使用a[]记每一个字母出现的次数
        }
        if(world.size()<=1){//去掉符号后只有一个字母或者为空
            return true;
        }
        else if(world.size()==2){//去掉符号有两字母
            if(world[0]==world[1]){
                return true;
            }
            else{
                return false;
            }
        }
        for(int j=0;j<26;j++){
            if(a[j]%2!=0){
                n++;//记录有多少个自出出现了奇数次,不可能有两个字母出现奇数次否则不构成回文
            }
        }
        if(n>=2){
            return false;
        }
        return true;
    }
};
```

如果是回文肯定是头尾一一对应,如果总长是奇数,则中间一数字不进行比较,将大写变为小写,然后将数字和字母一一存入容器中,代码如下:

```cpp
class Solution {
public:
    bool isPalindrome(string s) {
        vector<char> world;
        for(int i=0;i<s.length();i++){
            if(isupper(s[i])){//大写转化成小写
                s[i] = tolower(s[i]);
            }
            if((s[i]>='a' && s[i]<='z') || (s[i]>='0' && s[i]<='9')){//将所有字符转倒world中
                world.push_back(s[i]);
            }
        }
        for(int j=0;j<(world.size()/2);j++){
            if(world[j]!=world[world.size()-1-j]){
                return false;
                break;
            }
        }
        return true;
    }
};
```

发布了35 篇原创文章 · 获赞 27 · 访问量 506

猜你喜欢

转载自blog.csdn.net/weixin_45221477/article/details/104719572