谁能检查这个 Palindrome c++ 代码是不是正确?

Posted

技术标签:

【中文标题】谁能检查这个 Palindrome c++ 代码是不是正确?【英文标题】:Can anyone check if this Palindrome c++ code is correct?谁能检查这个 Palindrome c++ 代码是否正确? 【发布时间】:2019-06-18 09:03:22 【问题描述】:

这是我为检查 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";



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

【问题讨论】:

你可能想把这个发到codereview.stackexchange.com。 我认为你不应该遍历所有字符,而应该只遍历一半以上的字符,即for(int i = 0; i &lt;= index / 2; i++)。只要任何对不相等,您就可以退出(假)而不是计算相等的字符。 另外,你可以检查 if(text[i] != text[index-i]) return false; 是否是x 我不会返回std::string,而是返回bool,在需要时将bool 转换为string 比将"true" / "false" 转换为@ 要容易得多987654333@以备不时之需 属于codereview.stackexchange.com 【参考方案1】:

你的函数太复杂了。参数应该是常量引用类型,函数应该返回一个布尔值。

下面是一个演示程序,显示了函数使用循环的外观。

#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

【讨论】:

【参考方案2】:

由于回文是反转时相同的字符串,您可以使用std::equal 和这样的反向迭代器

#include <string>
#include <iostream>
#include <algorithm>

bool is_palindrome(const std::string &str)

    return std::equal(str.cbegin(), str.cbegin() + str.size()/2, str.crbegin());


int main() 
    std::cout << std::boolalpha;
    std::cout << is_palindrome("madam") << std::endl;
    std::cout << is_palindrome("poppy") << std::endl;

输出:

true
false

这种方法避免了为比较而创建一个反向的临时字符串。

或者,您可以使用两个索引实现一个循环,一个用于左侧,一个用于右侧,左侧递增,右侧递减:

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;

【讨论】:

【参考方案3】:

是的,您的逻辑是正确的,并且会产生正确的结果。

【讨论】:

【参考方案4】:

我同意人们对代码审查的看法,但是,您的代码看起来是正确的。 ......为什么不多扔几个回文版本呢?这是一个使用迭代器的方法,因此您可以使用相等运算符检查任何类型的范围:

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

【讨论】:

以上是关于谁能检查这个 Palindrome c++ 代码是不是正确?的主要内容,如果未能解决你的问题,请参考以下文章

谁能分解这个汇编代码的作用?

python C# - JS - Python - 算法:检查Palindrome

检查xcode中c代码的内存泄漏

用递归方法判断字符串是否是回文(Recursion Palindrome Python)

从未见过 C++ for 循环

(急)IP协议源代码(C++)中的转发函数谁能帮忙解释一下?