zoukankan      html  css  js  c++  java
  • LeetCode 125 Valid Palindrome(有效回文)(*)

    翻译

    给定一个字符串。确定它是否是回文的,仅仅考虑当中的数字和字符并忽略其它。
    
    比如。
    “A man, a plan, a canal: Panama” 是回文的。
    “race a car” 不是回文的
    
    批注:
    你是否考虑了字符串可能为空?这样的面试的时候是一个好问题。

    对于这问题的意图,我们定义空字符串是回文的。

    原文

    Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.
    
    For example,
    "A man, a plan, a canal: Panama" is a palindrome.
    "race a car" is not a palindrome.
    
    Note:
    Have you consider that the string might be empty? This is a good question to ask during an interview.
    
    For the purpose of this problem, we define empty string as valid palindrome.

    分析

    题目解出来并非非常难。只是须要细心只是还是会出错。

    第一步就是要从原字符串中的干扰去掉,也就是仅仅保留字母。这能够通过ascii来推断。

    然后构造出新的字符串。再推断这个新字符串是否是回文的就好了。

    然而我也还是错了。首先我没想清晰题目的样例。”aA”也是回文的。

    再一次改动之后我还是错了。由于题目的alphanumeric是字母数字均包括了,我一開始翻译的就是字母,后来上文的翻译也改动了。

    于是我确定彻底的改革,将功能独立出来,然而代码好长了。可是非常清晰:

    代码

    class Solution {
    public:
        bool isAlpha(char c) {
            int ascii = (int)c;
            if ((ascii >= 65 && ascii <= 90) || (ascii >= 97 && ascii <= 122))
                return true;
            else return false;
        }    
        bool isNumber(char c) {
            int ascii = (int)c;
            if (ascii >= 48 && ascii <= 57)
                return true;
            else return false;
        }       
        bool isAlphaAndNumber(char c1, char c2) {
            if ((isAlpha(c1) && isNumber(c2)) || (isAlpha(c2) && isNumber(c1)))
                return true;
            else return false;
        }       
        bool isPalindrome(string s) {
            if (s.size() == 0) return true;
            string newStr = "";
            for (int i = 0; i < s.size(); ++i) {
                // 仅仅取出当中的字母和数字
                if (isAlpha(s[i]) || isNumber(s[i]))
                    newStr += s[i];
            }
            for (int i = 0; i < newStr.size() / 2; ++i) {
                // 两者一个是字母、一个是数字
                if (isAlphaAndNumber(newStr[i], newStr[newStr.size() - i - 1]))
                    return false;
                // 两者均为数字
                else if (isNumber(newStr[i]) && isNumber(newStr[newStr.size() - i - 1])) {
                    // 推断是否是同一个数字
                    if (newStr[i] != newStr[newStr.size() - i - 1])
                        return false;
                }
                // 两者均为字母
                else {
                    // 前面推断是否是同一个字母,后面推断是否是互为大写和小写
                    if (newStr[i] != newStr[newStr.size() - i - 1] && abs((int)newStr[i] - (int)newStr[newStr.size() - i - 1]) != 32)
                        return false;
                }
            }
            return true;
        }                           
    };

    进阶

    一想到ascii就忘了还有toupper这些函数了,别人写的……

    class Solution {
    public:
        bool isPalindrome(string s) {
            int l = 0, r = s.size() - 1;
            while(l <= r){
                while(!isalnum(s[l]) && l < r) l++;
                while(!isalnum(s[r]) && l < r) r--;
                if(toupper(s[l]) != toupper(s[r])) return false;
                l++, r--;
            }
            return true;
        }
    };
  • 相关阅读:
    YourSQLDba低版本的一个Bug的浅析
    VMware虚拟机(Linux)如何找出系统中磁盘设备对应的硬盘
    SSH登录报pam_unix(sshd:auth): authentication failure的案例
    Linux shell中如何给文本加上行号呢
    Linux查看系统块大小
    存储基础知识:扇区与块/簇
    SQL Server中GETDATE转换时间时注意事项
    SQL Server 2008 R2执行存储过程sp_MailItemResultSets引起大量PREEMPTIVE_OS_WAITFORSINGLEOBJEC等待
    Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool
    SQL Server 2014下Database Mail Engine进程消耗大量CPU资源
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/7323581.html
Copyright © 2011-2022 走看看