谁能检查此Palindrome c ++代码是否正确?

时间:2019-06-18 09:03:22

标签: c++ string algorithm function palindrome

这是我构建的用于检查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";

}

结果是正确的,我只是找不到这样的代码,所以只想检查一下。

4 个答案:

答案 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());