题目:验证回文字符串
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama" 输出: true
示例 2:
输入: "race a car" 输出: false
解答:
回文字符串,即是正读和反读都是同一个字符串,如deed、minim和gig。在本题目存在空格和非字母数字等字符形式,难度增加。
- 要考虑的是去除空格和非字母数字的影响;
- 建立左右两组指针,left和right;
- 分别从字符的开头和结尾处开始遍历整个字符串,如果遇到非字母数字的字符就跳过,继续往下找,直到找到下一个字母数字或者结束遍历,如果遇到大写字母,就将其转为小写;
- 等左右指针都找到字母数字时,比较这两个字符,若相等,则继续比较下面两个分别找到的字母数字,若不相等,直接返回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;
}
}