127人参与 • 2025-03-03 • C/C++
在字符串处理中,判断一个字符串是否为回文串是一个经典问题。
本题有特殊要求:在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,如果短语正着读和反着读都一样,则认为该短语是一个回文串。字母和数字都属于字母数字字符。
s = "a man, a plan, a canal: panama",输出:true,解释:处理后得到 "amanaplanacanalpanama" 是回文串。s = "race a car",输出:false,解释:处理后得到 "raceacar" 不是回文串。s = " ",输出:true,解释:移除非字母数字字符后,s 是一个空字符串 "",空字符串正着反着读都一样,所以是回文串。原题链接

这种方法的核心思想是先遍历原字符串,把其中的字母数字字符提取出来,同时将大写字母转换为小写字母,存储到一个新的字符串 tmp 中
然后再对新字符串 tmp 进行回文判断
#include <iostream>
#include <string>
class solution {
public:
bool ispalindrome(string s) //第一种方式 将字母数字连接到新的string
{
string tmp;
string::iterator left = s.begin();
string::iterator right = s.end();
while (left != right)//第一次遍历,所有字母数字转入新string,并且统一为小写
{
if ((*left >= '0' && *left <= '9') || (*left >= 'a' && *left <= 'z'))
tmp += *left;
if (*left >= 'a' && *left <= 'z')
tmp += (*left + 32);
++left;
}
if (tmp.empty())//如果新string为空,则判定为回文串
return true;
left = tmp.begin();
right = tmp.end() - 1;
while (left <= right)//第二次遍历 左右迭代器逐个对比
{
if (*left == *right)
{
++left;
--right;
}
else
return false;
}
return true;
}
};tmp 用于存储处理后的字符。left 遍历原字符串 s,当遇到数字('0' 到 '9')或小写字母('a' 到 'z')时,直接添加到 tmp 中;当遇到大写字母('a' 到 'z')时,将其 ascii 码值加 32 转换为小写字母后添加到 tmp 中。tmp 为空字符串,根据题目定义,空字符串是回文串,直接返回 true。left 指向 tmp 的开头,right 指向 tmp 的结尾,逐个比较对应位置的字符。如果不相等,返回 false;如果都相等,最终返回 true。这种方法不创建新的字符串,而是直接在原字符串上使用双指针法进行筛选和判断。通过两个指针 left 和 right 分别从字符串的两端开始向中间移动,跳过非字母数字字符,同时将字符转换为小写后进行比较。
#include <iostream>
#include <string>
#include <cctype>
class solution {
public:
bool ispalindrome(std::string s) //第二种方式,直接原地筛选判断
{
string::iterator left = s.begin();
string::iterator right = s.end() - 1;
while (left < right)
{
// 跳过左边的非字母数字字符
while (left < right && !isalnum(*left))
{
++left;
}
// 跳过右边的非字母数字字符
while (left < right && !isalnum(*right))
{
--right;
}
if (left < right) {
// 将字符转换为小写后比较
if (tolower(*left) != tolower(*right))
{
return false;
}
++left;
--right;
}
}
//跳出循环,要么left==right,要么left>right
//说明所有需要比较的字符对都已经检查过,且都相等
return true;
}
};left 指向字符串的开头,right 指向字符串的结尾。while 循环,分别将 left 和 right 指针移动到字母数字字符的位置。left 和 right 指针指向的字符转换为小写后进行比较,如果不相等,返回 false;如果相等,继续移动指针。left 大于等于 right 时,说明所有需要比较的字符对都已经检查过,且都相等,返回 true。两种解法都能有效解决回文串判断问题:
解法一逻辑清晰,易于理解,但需要额外的空间存储处理后的字符串;
解法二原地操作,空间复杂度更低,更适合处理大规模数据。在实际应用中,可以根据具体需求选择合适的解法。
以上就是c++实现回文串判断的两种高效方法的详细内容,更多关于c++回文串判断的资料请关注代码网其它相关文章!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论