力扣:125. 验证回文串

在这里插入图片描述

力扣:125. 验证回文串_第1张图片

题目部分:

力扣:125. 验证回文串_第2张图片

解题思路:

方案一:

仔细审题我们会发现依旧是比较典型的双指针问题,值得注意的点就是题目所述的如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样,才可以认为该短语是一个回文串。

根据题意我们就明确地知道需要一个判断方法:即指针当前所指向位置是否符合条件——是字母数字字符。实现逻辑相对简单就是满足字符是在0到9、A到Z、a到z闭区间包含即可符合题意要求。

有了上述排除所有非字母数字字符的方法以后,接下来就是老套路用双指针从两边依次往中间偏移判断是否是回文串。在判断之前我们要先确保指针所指向的位置一定要是字母数字字符,若不是则移动到下一个位置,直至找到满足条件的位置才能开始判断。其次就是题目是不区分大小写字母的区别,统一按照大写字母也转成小写字母来判断的要求,这点别忘记了。(所以这里借用了string类中的tolower方法,即使是大写字母也会转成其对应的小写字母)最后就是切记每次判断完成之后还要记得移动双指针的位置。

接下来我以示例1进行图解的方式让大家更容易理解。

力扣:125. 验证回文串_第3张图片

图解:

方案一演示代码讲解如下:

力扣:125. 验证回文串_第4张图片

附:方案一代码提取:

class Solution {
public:

	// 移除所有非字母数字字符
	bool isLeterOrNumber(char ch)
	{
		if (ch >= '0'&&ch <= '9')
		{
			return true;
		}

		if (ch >= 'A'&&ch <= 'Z')
		{
			return true;
		}

		if (ch >= 'a'&&ch <= 'z')
		{
			return true;
		}

		return false;
	}

	bool isPalindrome(string s) {
		int begin = 0, end = s.size() - 1; // 拿到字符的起始和末尾位置
		while (begin < end)
		{
			// 排除起始位置存在非字母数字字符
			while (begin < end && !isLeterOrNumber(s[begin]))
			{
				++begin;
			}

			// 排除末尾位置存在非字母数字字符
			while (begin < end && !isLeterOrNumber(s[end]))
			{
				--end;
			}

			// 两个位置统一转换成小写进行判断
			if (tolower(s[begin]) != tolower(s[end]))
			{
				return false;
			}

			++begin;
			--end;
		}

		return true;
	}
};

测试结果:

力扣:125. 验证回文串_第5张图片

不出意外的话家人们肯定是狠狠拿下!

在这里插入图片描述

备注:

楼主不才,不喜勿喷,若有错误或需要改进的地方,非常感谢你的指出,我会积极学习采纳。谢谢家人们一直以来的支持和鼓励,我会继续努力再接再励创作出更多优质的文章来回报家人们的。编程爱好的xdm,若有编程学习方面的问题可以私信我一同探讨(我尽力帮),毕竟“众人拾柴火焰高”,大家一起交流学习,共同进步!

在这里插入图片描述

2023年4月17日

你可能感兴趣的:(努力扣门方能成就伟业,c++)