当试图回答一个问题时,如何在回文中使用入队、出队、推送和查看? https://stackoverflow.com/questions/67972457/how-to-use-enqueu-dequeue-push-and-peek-in-a-palindrome/67972736#67972736,我建议可以使用找到回文std::string
by:
bool isPalindrome(const std::string str)
{
return std::equal(str.begin(), str.end(), str.rbegin(), str.rend());
}
对于 Unicode 字符串,我建议:
bool isPalindrome(const std::u8string str)
{
std::u8string rstr{str};
std::reverse(rstr.begin(), rstr.end());
return str == rstr;
}
我现在认为,当字符串中包含多字节字符时,这会产生问题,因为多字节字符的字节顺序也是相反的。此外,某些字符在不同的语言环境中将彼此等效。因此,在 C++20 中:
- 如何使多字节字符的比较稳健?
- 当多个字符之间存在等效性时,如何使比较对不同区域设置具有鲁棒性?
反转 Unicode 字符串变得非常重要。从 UTF-8 转换为 UTF-32/UCS-4 是一个好的开始,但仅靠它本身还不够 - Unicode 还具有组合代码点,因此两个(或更多)连续的代码点形成单个结果字素(添加的代码点将变音符号标记添加到基本字符),并且为了使事情正常工作,您需要保持它们的正确顺序。
因此,基本上,您需要将输入划分为一系列字素,而不是代码点,并反转字素的顺序,而不仅仅是代码点。
为了处理表示相同字符序列的多个不同的代码点序列,您通常需要进行规范化。有四种不同的标准化形式。在这种情况下,你会probably想要使用 NFC 或 NFD(对于此目的应该是等效的)。 NFKC/NFKD 形式主要是为了与其他字符集兼容,这听起来像你probably不在乎。
但这也可能是不平凡的。仅举一个众所周知的例子,考虑德语字符“ß”。这有点相当于“ss”,但仅以小写形式存在,因为它永远不会出现在单词的开头。因此,关于是否存在类似的事情可能还有争论的余地Ssaß
是否是回文(暂时忽略它实际上不是一个单词的小细节)。对于回文,大多数人都会忽略字母大小写,所以它会是 - 但问题中的代码似乎将大小写视为重要的,在这种情况下可能不应该如此。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)