1、回文字符串
- 回文是一类特殊的字符串,不管是从头到尾读取一个回文,还是颠倒过来从尾到头读取一个回文,得到的内容是一样的。
2、LCR 018. 验证回文串
题目信息:
- https://leetcode.cn/problems/XltzEq/description/
给定一个字符串 s ,验证 s 是否是 回文串 ,只考虑字母和数字字符,可以忽略字母的大小写。
本题中,将空字符串定义为有效的 回文串 。
示例 1:
输入: s = "A man, a plan, a canal: Panama"
输出: true
解释:"amanaplanacanalpanama" 是回文串
示例 2:
输入: s = "race a car"
输出: false
解释:"raceacar" 不是回文串
提示:
1 <= s.length <= 2 * 105
字符串 s 由 ASCII 字符组成
解题思路:
- 输入一个字符串s,判断s是否是回文串,字符串由字母数组和符号空格组成,只判断数字和字母,忽略大小写
- 回文串是字符串正读和反读都一样,在该题中,使用双指针解法,一个从左开始遍历,一个从最右端开始遍历,判断是否是数字和字母,不是的话,继续移动指针
- 是的话,判断两个指针指向的字符是否相等,不相等,直接返回false
代码实现:
bool isPalindrome1(string s)
{
int left = 0;
int right = s.length() - 1;
while (left < right)
{
char leftCh = s[left];
if (!std::isalnum(leftCh))
{
left++;
continue;
}
char rightCh = s[right];
if (!std::isalnum(rightCh))
{
right--;
continue;
}
if (std::toupper(leftCh) != std::toupper(rightCh))
{
return false;
}
left++;
right--;
}
return true;
}
优化写法:
- 先遍历字符串中所有字符,转成小写
- 在while循环中,继续使用while循环过滤非字母和数字的字符,接着直接判断是否相等