LeetCode(125):验证回文串

Easy!

题目描述:

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

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

示例 1:

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

示例 2:

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

解题思路:

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

C++解法一:

 1 class Solution {
 2 public:
 3     bool isPalindrome(string s) {
 4         int left = 0, right = s.size() - 1 ;
 5         while (left < right) {
 6             if (!isAlphaNum(s[left])) ++left;
 7             else if (!isAlphaNum(s[right])) --right;
 8             else if ((s[left] + 32 - 'a') %32 != (s[right] + 32 - 'a') % 32) return false;
 9             else {
10                 ++left; --right;
11             }
12         }
13         return true;
14     }
15     bool isAlphaNum(char &ch) {
16         if (ch >= 'a' && ch <= 'z') return true;
17         if (ch >= 'A' && ch <= 'Z') return true;
18         if (ch >= '0' && ch <= '9') return true;
19         return false;
20     }
21 };

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

C++解法二:

 1 class Solution {
 2 public:
 3     bool isPalindrome(string s) {
 4         int left = 0, right = s.size() - 1 ;
 5         while (left < right) {
 6             if (!isalnum(s[left])) ++left;
 7             else if (!isalnum(s[right])) --right;
 8             else if ((s[left] + 32 - 'a') %32 != (s[right] + 32 - 'a') % 32) return false;
 9             else {
10                 ++left; --right;
11             }
12         }
13         return true;
14     }
15 };

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

猜你喜欢

转载自www.cnblogs.com/ariel-dreamland/p/9166245.html