博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode 125 Valid Palindrome(有效回文)(*)
阅读量:6500 次
发布时间:2019-06-24

本文共 2799 字,大约阅读时间需要 9 分钟。

版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/50623165

翻译

给定一个字符串,确定它是否是回文的,仅仅考虑其中的数字和字符并忽略其他。例如,“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;    }};
你可能感兴趣的文章
LeetCode:4_Median of Two Sorted Arrays | 求两个排序数组的中位数 | Hard
查看>>
python之commands模块
查看>>
android应用开发--------------看RadioGroup源代码,写相似单选选项卡的集成控件(如底部导航,tab等等)...
查看>>
LeetCode - Binary Tree Level Order Traversal
查看>>
FTP协议完全详解
查看>>
【C语言天天练(十五)】字符串输入函数fgets、gets和scanf
查看>>
【环境配置】配置sdk
查看>>
accept()
查看>>
USB 2.0 Hub IP Core
查看>>
USB 2.0 OTG IP Core
查看>>
解读浮动闭合最佳方案:clearfix
查看>>
Charles使用
查看>>
Python GUI编程(Tkinter) windows界面开发
查看>>
dynamic关键字的使用
查看>>
iOS 音乐播放器之锁屏效果+歌词解析
查看>>
android O 蓝牙设备默认名称更改
查看>>
阳台的青椒苗
查看>>
swapper进程【转】
查看>>
跨链技术与通证经济
查看>>
爬虫学习之-xpath
查看>>