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。
原文地址:https://www.cnblogs.com/ariel-dreamland/p/9166245.html
时间: 2024-10-07 05:37:17