125. Valid Palindrome
Easy
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.
Note: For the purpose of this problem, we define empty string as valid palindrome.
Example 1:
Input: "A man, a plan, a canal: Panama" Output: true
Example 2:
Input: "race a car" Output: false
先要理解题目,这道题的意思是只考虑数字和字母(字母不分大小写),看看是不是对称的。比如"A man, a plan, a canal: Panama",这个,s[0]=A, s[23]=a, 首尾相等,然后指针往内部移动,s[1]不是字母或数字,所以比较s[2].s[2]=m, s[22]=m,s[2]==s[22],所以可以继续网内移动指针。这道题例1有点像个句子,有迷惑性,让人难以理解题目。但必须要搞清楚题目要求才能往下。
解题思路是创建个大小写对应的map表,再弄个string,先判断符号是否属于string或者map,如果都不属于,则越过这个char。建两个指针i,j,分别从首尾超中间移动。每次比较前需要做前面说的判断(第一步),然后判断如果属于map,让这个char等于map的值(第二步),最后比较首尾字符。终止比较的条件是j<=i,即while(j>=i)。
提交的时候有些特例需要写,第一个特例是只有1个字符输入,直接返回true,第二个特例是“‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘”,这个特例会导致在做第一步时溢出,需要加个限制条件,如果i++==j,j--==i此时应该return true。
虽然是到easy的题目,但是还是有点花头的。
下面是AC的答案。
class Solution {
public:
bool isPalindrome(string s) {
map<char, char> mp = { { 'A','a' },{ 'B','b' },{ 'C','c' },{ 'D','d' },{ 'E','e' },{ 'F','f' },{ 'G','g' },{ 'H','h' },{ 'I','i' },{ 'J','j' },{ 'K','k' },{ 'L','l' },{ 'M','m' },{ 'N','n' },{ 'O','o' },{ 'P','p' },{ 'Q','q' },{ 'R','r' },{ 'S','s' },{ 'T','t' },{ 'U','u' },{ 'V','v' },{ 'W','w' },{ 'X','x' },{ 'Y','y' },{ 'Z','z' } };
string c = "abcdefghijklmnopqrstuvwxyz0123456789";
if(s.length()==1)return true;
int i = 0;
int j = s.length() - 1;
while (j >= i)
{
while (c.find(s[i]) == string::npos && mp.find(s[i]) == mp.end()) { i++; if(i== j)return true;}
while (c.find(s[j]) == string::npos && mp.find(s[j]) == mp.end()) { j--; if(j==i)return true;}
if (mp.find(s[i]) != mp.end())s[i] = mp.at(s[i]);
if (mp.find(s[j]) != mp.end())s[j] = mp.at(s[j]);
if (s[j] != s[i])return false;
j--;
i++;
}
return true;
}
};