10人参与 • 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 举报,一经查实将立刻删除。
发表评论