leetcode:验证回文串(详解)
前言:内容包括:题目,代码实现,大致思路
题目:
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 。
示例 1:
输入: s = "A man, a plan, a canal: Panama"
输出:true
解释:"amanaplanacanalpanama" 是回文串。
示例 2:
输入:s = "race a car"
输出:false
解释:"raceacar" 不是回文串。
示例 3:
输入:s = " "
输出:true
解释:在移除非字母数字字符之后,s 是一个空字符串 "" 。
由于空字符串正着反着读都一样,所以是回文串。
代码实现:
bool Judge(char ch)//判断一个元素是否为数字字符or字母字符
{
if(isdigit(ch) || isalpha(ch))
{
return true;
}
else
{
return false;
}
}
bool isPalindrome(char * s)
{
int len = strlen(s);
int left = 0;
int right = len-1;
while(left<right)
{
if(Judge(s[left]) && Judge(s[right]))//两个元素都是合法字符
{
if(isupper(s[left]) || isupper(s[right]))//两个元素中有元素是大写字母
{
s[left] = tolower(s[left]);//转成小写字母
s[right] = tolower(s[right]);
}
if(s[left]!=s[right])//两个元素不相等
{
return false;
}
left++;//指向下一对要比较的元素
right--;
}
else if(!Judge(s[left]))//非法元素
{
left++;
}
else if(!Judge(s[right]))//非法元素
{
right--;
}
}
return true;
}
大致思路:
1 定义双指针 left right
left用于遍历字符串的前半部分 right用于遍历字符串的后半部分
2 首先判断left和right指向的两个字符是否是数字字符or字母字符
若不是,则找出left和right指向的元素中哪个是非法字符,还是都为非法字符:
若left指向的元素是非法字符,则left++,跳过这个非法字符,指向左半部分下一个要判断的字符
若right指向的元素是非法字符 则right--,跳过这个非法字符,指向右半部分下一个要判断的字符
若是合法字符:
a 判断left和right指向的两个字符是否为大写字母字符,若是,则转成小写字母字符
b 判断这两个元素是否相等,不等则返回false,相等则left++,right--,分别指向下一对要比较的元素
3 当整个循环结束后还没有提前返回,说明此字符串是回文串,返回true