回文串判断: 将字符串中所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个回文串 。其中字母和数字都属于字母数字字符。
要求:一个字符串s,如果它是回文串,返回true;否则,返回false 。
注意: 单个字符和空字符,正着读和反着读都一样,那么也属于回文串。
示例 1:
输入: s = "A man, a plan, a canal: Panama"
输出:true
示例 2:
输入:s = "race a car"
输出:false
解释:"raceacar" 不是回文串。
示例 3:
输入:s = "a"
输出:true
示例 4:
输入:s = "a"
输出:true
解析: 将字符串先去掉非数字字符等字符,在转换为小写。
构成的新字符串,第0好字符和第size()-1个字符要相同。
示例源码:
// Len_Palindrome.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <string>
using namespace std;
// 大写转小写
char UpperToLower(char c)
{
char result = c;
if (c >= 'A' && c <= 'Z')
{
result = c + 32;
}
return result;
}
// 判断是否数字字符类型
bool IsChar(char c)
{
if ((c >= 'A' && c <= 'Z') ||
(c >= 'a' && c <= 'z') ||
(c >= '0' && c <= '9'))
{
return true;
}
return false;
}
// 返回新字符串
string ReturnPureC(string s)
{
string result;
for (int i = 0; i < s.size(); i++)
{
if (IsChar(s[i]))
{
result.push_back(UpperToLower(s[i]));
}
}
return result;
}
// 判断是否回文
bool JudgePalindrome(string s)
{
string newS = ReturnPureC(s);
if (newS.size() <= 1)
{
return true;
}
int maxLen = newS.size() - 1;
int Len = newS.size() / 2;
for (int i = 0; i <= Len; i++)
{
if (newS[i] != newS[maxLen - i])
{
return false;
}
}
return true;
}
int main()
{
string s = "A man, a plan, a canal: Panama";
bool bResult = JudgePalindrome(s);
printf("\n示例1");
printf("\n输入: s=\"%s\"", s.c_str());
printf("\n输出: %s", (bResult == 0) ? ("false") : ("true"));
s = "race a car";
bResult = JudgePalindrome(s);
printf("\n\n示例2");
printf("\n输入: s=\"%s\"", s.c_str());
printf("\n输出: %s", (bResult == 0) ? ("false") : ("true"));
s = "1P";
bResult = JudgePalindrome(s);
printf("\n\n示例3");
printf("\n输入: s=\"%s\"", s.c_str());
printf("\n输出: %s", (bResult == 0) ? ("false") : ("true"));
s = " ";
bResult = JudgePalindrome(s);
printf("\n\n示例4");
printf("\n输入: s=\"%s\"", s.c_str());
printf("\n输出: %s", (bResult == 0) ? ("false") : ("true"));
}
执行结果: