Easy!

题目描述:

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

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

示例 1:

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

示例 2:

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

解题思路:

验证回文字符串是比较常见的问题,所谓回文,就是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。但是这里,加入了空格和非字母数字的字符,增加了些难度,但其实原理还是很简单:只需要建立两个指针,left和right, 分别从字符的开头和结尾处开始遍历整个字符串,如果遇到非字母数字的字符就跳过,继续往下找,直到找到下一个字母数字或者结束遍历,如果遇到大写字母,就将其转为小写。等左右指针都找到字母数字时,比较这两个字符,若相等,则继续比较下面两个分别找到的字母数字,若不相等,直接返回false,时间复杂度为O(n)。

C++解法一:

 class Solution {
public:
bool isPalindrome(string s) {
int left = , right = s.size() - ;
while (left < right) {
if (!isAlphaNum(s[left])) ++left;
else if (!isAlphaNum(s[right])) --right;
else if ((s[left] + - 'a') % != (s[right] + - 'a') % ) return false;
else {
++left; --right;
}
}
return true;
}
bool isAlphaNum(char &ch) {
if (ch >= 'a' && ch <= 'z') return true;
if (ch >= 'A' && ch <= 'Z') return true;
if (ch >= '' && ch <= '') return true;
return false;
}
};

我们也可以用系统自带的判断是否是数母字符的判断函数isalnum。

C++解法二:

 class Solution {
public:
bool isPalindrome(string s) {
int left = , right = s.size() - ;
while (left < right) {
if (!isalnum(s[left])) ++left;
else if (!isalnum(s[right])) --right;
else if ((s[left] + - 'a') % != (s[right] + - 'a') % ) return false;
else {
++left; --right;
}
}
return true;
}
};

对于该问题的扩展,还有利用Manacher算法来求解最长回文字符串问题,参见http://www.cnblogs.com/grandyang/p/4475985.html。

最新文章

  1. Centos 安装配置gerrit
  2. 关于js中for in和foreach in的区别
  3. sublime mac osx 命令行打开
  4. Failed to load or instantiate
  5. 九度oj 1530 最长不重复子串
  6. websphere中由于实际应用没有卸载干净,导致安装不了。以下是完全卸载应用程序的方法
  7. php中一些安全性防止问题建议
  8. [jobdu]最小的K个数
  9. 10分钟进阶Nuget
  10. linux之SQL语句简明教程---INSERT INTO
  11. Linux常用命令及shell技巧
  12. Comparators.sort (转载)
  13. 【翻译】在Ext JS应用程序中使用自定义图标
  14. mybatis的配置和使用
  15. Oracle 导入导出报错的简单处理
  16. CSS/让一个盒子消失的5中方法
  17. LoadRunner-迭代和并发设置
  18. ovs 源mac, 目的src 互换
  19. Boltzmann机神经网络python实现
  20. android studio gradle 国内代理

热门文章

  1. 【JS】正则向前查找和向后查找
  2. java 基础 浮点类型
  3. Html - 后台模板
  4. Django 基于类的通用视图
  5. 【NLP CS224N笔记】汇总
  6. Web方面的错误, 异常来自hresult:0x80070057(E_INVALIDARG)
  7. C++中的static关键字总结
  8. FAT文件系统规范v1.03学习笔记---1.保留区之启动扇区与BPB
  9. Linux IDR机制【转】
  10. css3实现不同进度条