验证回文字符串 C++算法 leetcode125

题目:验证回文字符串

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

说明:本题中,我们将空字符串定义为有效的回文串。

示例 1:

输入: "A man, a plan, a canal: Panama"
输出: true

示例 2:

输入: "race a car"
输出: false

解答:

回文字符串,即是正读和反读都是同一个字符串,如deed、minim和gig。在本题目存在空格和非字母数字等字符形式,难度增加。

  1. 要考虑的是去除空格和非字母数字的影响;
  2. 建立左右两组指针,left和right;
  3. 分别从字符的开头和结尾处开始遍历整个字符串,如果遇到非字母数字的字符就跳过,继续往下找,直到找到下一个字母数字或者结束遍历,如果遇到大写字母,就将其转为小写;
  4. 等左右指针都找到字母数字时,比较这两个字符,若相等,则继续比较下面两个分别找到的字母数字,若不相等,直接返回false。

时间复杂度为O(n)。

代码示例:

1.将上述所需功能进行类的封装

class Solution {
public:
	bool isPalindrome(string s) 
	{
		int left = 0, right = s.size() - 1;
		while (left < right) 
		{
			if (!isAlphaNum(s[left])) 
				++left;
			else if (!isAlphaNum(s[right])) 
				--right;
			else if ((s[left] + 32 - 'a') % 32 != (s[right] + 32 - 'a') % 32) 
				return false;
			else {
				++left; 
				--right;
			}
		}
		return true;
	}
	bool isAlphaNum(char &ch) 
	{
		if (ch >= 'a' && ch <= 'z') 
			return true;
		if (ch >= 'A' && ch <= 'Z') 
			return true;
		if (ch >= '0' && ch <= '9') 
			return true;
		return false;
	}
};

分析:这个类里面有两个函数:

1.isPalindrome(string s)

首先定义左右指针,left赋值为0,right赋值字符串最大值s.size()-1;

当left<rihgt时,一直进入while循环,通过isAlphaNum(char &ch)函数来检验是否是非字母字符,若是,则自加一/自减一,跳过;

若字符串中出现大写字母,通过下面指令转换为小写字母

 else if ((s[left] + 32 - 'a') %32 != (s[right] + 32 - 'a') % 32)

PS:

//如何是‘A’或者‘a’的话,它们减去‘a’得到的数分别是:-32和0,再加上32的话正好是0和32,除以32——余数都为0

//如何是‘B’或者‘b’的话,它们减去‘a’得到的数分别是:-31和1,再加上32的话正好是1和33,除以32——余数都为1

 再通过括号里的判断,进行判定大小写字母是否为同一个字母,若是往下继续执行,若不是,跳出循环,返回false。

2.isAlphaNum(char &ch)

这个函数用来判断,字符串中该字符是数字还是字母。

2.头文件

#include<iostream>
#include<string>

using namespace std;

3.主函数

int main()
{
	string s = "A man, a plan, a canal: Panama";
	class Solution pt;
	int R=pt.isPalindrome(s);
	if (R)
	{
		cout << "true" << endl;
	}
	else
	{
		cout << "flase" << endl;
	}
}

先定义字符串string s="A man, a plan, a canal: Panama" 调用类class solution。判断R值,输出true/false。

写的代码都在VS2015下测试没有问题,如果输入为string s="A man, a plan, a canal: Panama"

该题所有测试代码如下

#include<iostream>
#include<string>

using namespace std;

class Solution {
public:
	bool isPalindrome(string s) 
	{
		int left = 0, right = s.size() - 1;
		while (left < right) 
		{
			if (!isAlphaNum(s[left])) 
				++left;
			else if (!isAlphaNum(s[right])) 
				--right;
			else if ((s[left] + 32 - 'a') % 32 != (s[right] + 32 - 'a') % 32) 
				return false;
			else {
				++left; 
				--right;
			}
		}
		return true;
	}
	bool isAlphaNum(char &ch) 
	{
		if (ch >= 'a' && ch <= 'z') 
			return true;
		if (ch >= 'A' && ch <= 'Z') 
			return true;
		if (ch >= '0' && ch <= '9') 
			return true;
		return false;
	}
};

int main()
{
	string s = "A man, a plan, a canal: Panama";
	class Solution pt;
	int R=pt.isPalindrome(s);
	if (R)
	{
		cout << "true" << endl;
	}
	else
	{
		cout << "flase" << endl;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_37648020/article/details/83926245