[LeetCode] Valid Palindrome 验证回文字符串
2014-10-17 04:09
399 查看
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.
For example,
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.
验证回文字符串是比较常见的问题,所谓回文,就是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。但是这里,加入了空格和非字母数字的字符,增加了些难度,但其实原理还是很简单:只需要建立两个指针,left和right, 分别从字符的开头和结尾处开始遍历整个字符串,如果遇到非字母数字的字符就跳过,继续往下找,直到找到下一个字母数字或者结束遍历,如果遇到大写字母,就将其转为小写。等左右指针都找到字母数字时,比较这两个字符,若相等,则继续比较下面两个分别找到的字母数字,若不相等,直接返回false.
时间复杂度为O(n), 代码如下:
对于该问题的扩展,还有利用Manacher算法来求解最长回文字符串问题,参见我的另一篇博文Manacher's Algorithm 马拉车算法。
LeetCode All in One 题目讲解汇总(持续更新中...)
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.
验证回文字符串是比较常见的问题,所谓回文,就是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。但是这里,加入了空格和非字母数字的字符,增加了些难度,但其实原理还是很简单:只需要建立两个指针,left和right, 分别从字符的开头和结尾处开始遍历整个字符串,如果遇到非字母数字的字符就跳过,继续往下找,直到找到下一个字母数字或者结束遍历,如果遇到大写字母,就将其转为小写。等左右指针都找到字母数字时,比较这两个字符,若相等,则继续比较下面两个分别找到的字母数字,若不相等,直接返回false.
时间复杂度为O(n), 代码如下:
class Solution { public: bool isPalindrome(string s) { if (s.length() < 2) return true; int left = 0, right = s.length() - 1 ; while (left <= right) { while (left < s.length() - 1 && !isAlphaNumber(s[left])) ++left; while (right >= 0 && !isAlphaNumber(s[right])) --right; if (s[left] != s[right] && left <= right) return false; ++left; --right; } return true; } bool isAlphaNumber(char &ch) { if (ch >= 'a' && ch <= 'z') return true; if (ch >= 'A' && ch <= 'Z') { ch += 32; return true; } if (ch >= '0' && ch <= '9') return true; return false; } };
对于该问题的扩展,还有利用Manacher算法来求解最长回文字符串问题,参见我的另一篇博文Manacher's Algorithm 马拉车算法。
LeetCode All in One 题目讲解汇总(持续更新中...)
相关文章推荐
- [LeetCode] 125. Valid Palindrome 验证回文字符串
- [LeetCode] Valid Parentheses 验证括号
- [LeetCode] Valid Anagram 验证变位词
- LeetCode Valid Sudoku数独有效性验证
- 【初级算法】16. 验证回文字符串
- Leetcode 100. Same Tree 验证树是否相同 解题报告
- 【LeetCode-面试算法经典-Java实现】【020-Valid Parentheses(括号验证)】
- leetcode 98. 验证二叉搜索树
- LeetCode 331. Verify Preorder Serialization of a Binary Treet 二叉树前序遍历验证 Python Solution
- 【LeetCode-面试算法经典-Java实现】【098-Validate Binary Search Tree(验证二叉搜索树)】
- [Leetcode] valid palindrome 验证回文
- [LeetCode] Valid Parenthesis String 验证括号字符串
- [LeetCode] Valid Sudoku 验证数独
- LeetCode - 125. 验证回文串
- leetcode-125. Valid Palindrome(验证含有标点符号String是否为回文串)
- [LeetCode] Valid Square 验证正方形
- [leetcode 255] Verify Preorder Sequence in Binary Search Tree ---先序遍历验证二叉搜索树
- leetcode 229. Majority Element II 摩尔投票法 Moore Voting + 要记住验证投票结果哦
- [LeetCode] Validate Binary Search Tree 验证二叉搜索树
- [LeetCode] Valid Tic-Tac-Toe State 验证井字棋状态