这是我构建的用于检查c ++中回文词的程序。它不能以通常的方式工作(反转单词并检查单词是否相同),但它直接从头到尾检查每个单词;
夫人,阿达,汉娜,赛车是我尝试过的词,它们似乎是正确的。
#include <iostream>
std::string is_palindrome(std::string text)
{
int length=text.size(); //No. of characters
int index=text.size()-1; //No. of indexes
int i;
int x=0; //To store no of same character from both ends
for(i=0;i<=index;i++)
{
if(text[i]==text[index-i])
{x++;}
}
if(x==length) //If all characters are same form opp ends
{
return "true";
}
else
{
return "false";
}
}
int main() {
std::cout << is_palindrome("madam") << "\n";
std::cout << is_palindrome("happy") << "\n";
}
结果是正确的,我只是找不到这样的代码,所以只想检查一下。
答案 0 :(得分:3)
您的功能太复杂。该参数应为常量引用类型,并且该函数应返回布尔值。
下面有一个演示程序,显示了使用循环的功能外观。
#include <iostream>
#include <iomanip>
#include <string>
bool is_palindrome( const std::string &s )
{
std::string::size_type i = 0, n = s.length();
while ( i < n / 2 && s[i] == s[n - i - 1] ) ++i;
return i == n / 2;
}
int main()
{
std::cout << std::boolalpha << is_palindrome( "madam" ) << "\n";
std::cout << std::boolalpha << is_palindrome( "happy" ) << "\n";
return 0;
}
其输出为
true
false
您可以缩短函数的编写,如下面的演示程序所示。但是,该函数比使用循环的函数效率低,因为它需要为临时字符串std::string( std::rbegin( s ), std::rend( s ) )
#include <iostream>
#include <iomanip>
#include <string>
#include <iterator>
bool is_palindrome( const std::string &s )
{
return s == std::string( std::rbegin( s ), std::rend( s ) );
}
int main()
{
std::cout << std::boolalpha << is_palindrome( "madam" ) << "\n";
std::cout << std::boolalpha << is_palindrome( "happy" ) << "\n";
return 0;
}
程序输出与上面显示的相同,是
true
false
答案 1 :(得分:0)
既然回文是颠倒的字符串,为什么不直接使用std :: reverse()颠倒字符串并检查它是否与原始字符串相同?
示例:
bool is_palindrome(const std::string &str)
{
std::string revstr(str);
std::reverse(std::begin(revstr), std::end(revstr));
return revstr == str;
}
或者,您可以实现一个具有两个索引的循环,一个索引用于左,右索引,向左递增,向右递减:
bool is_palindrome(const std::string &str)
{
int len = str.length();
for (int left = 0, right = len-1; left < right; ++left, --right)
{
if (str[left] != str[right])
return false;
}
return true;
}
答案 2 :(得分:0)
是的,您的逻辑是正确的,并将产生正确的结果。
答案 3 :(得分:0)
我同意人们的看法,这有助于代码审查,但是,您的代码看起来正确。 ...以及为什么不多投几个回文版本呢?这是使用迭代器的一种,因此您可以使用相等运算符检查任何类型的范围:
template<typename It>
bool is_palindrome(It first, It last) {
if(first == last) return true;
It end = std::prev(last);
while(first < end) {
if(*first != *end) return false;
std::advance(first, 1);
std::advance(end, -1);
}
return true;
}
还有一线:
bool is_palindrome = std::equal(str.begin(),
std::next(str.begin(), str.size() / 2),
str.rbegin());