检查字符串是否是回文

Wil*_*rim 10 c++

可能重复:
查找给定字符串是否为回文结构或不是回文结构

我需要创建一个程序,允许用户输入一个字符串,我的程序将检查他们输入的字符串是否是回文(可以向前读取相同的单词).

Cub*_*bbi 58

请注意,反转整个字符串(使用rbegin()/ rend()range构造函数或使用std::reverse)并将其与输入进行比较将执行不必要的工作.

将字符串的前半部分与后半部分进行比较就足够了,反之亦然:

#include <string>
#include <algorithm>
#include <iostream>
int main()
{
    std::string s;
    std::cin >> s;
    if( equal(s.begin(), s.begin() + s.size()/2, s.rbegin()) )
        std::cout << "is a palindrome.\n";
    else
        std::cout << "is NOT a palindrome.\n";
}
Run Code Online (Sandbox Code Playgroud)

演示:http://ideone.com/mq8qK

  • +1 在资源和时间复杂度方面绝对更好 (4认同)

Set*_*gie 38

只需比较字符串与其自身的反转:

string input;

cout << "Please enter a string: ";
cin >> input;

if (input == string(input.rbegin(), input.rend())) {
    cout << input << " is a palindrome";
}
Run Code Online (Sandbox Code Playgroud)

这个构造函数string接受一个开始和结束迭代器,并从这两个迭代器之间的字符创建字符串.因为rbegin()是字符串的结尾并且递增它后退通过字符串,我们创建的字符串将具有input反向添加到其中的字符,反转字符串.

然后你只需将它input与它们进行比较,如果它们相等,它就是一个回文.

这不考虑大小写或空格,所以你必须自己改进.

  • 除了显而易见的抱怨之外,我会投票给你答案:它是家庭作业,提供方法/算法,而不是代码.从这项练习中学到了什么,懒惰付出了代价.:( (3认同)

sel*_*bie 6

bool IsPalindrome(const char* psz)
{
    int i = 0;
    int j;

    if ((psz == NULL) || (psz[0] == '\0'))
    {
        return false;
    }

    j = strlen(psz) - 1;
    while (i < j)
    {
        if (psz[i] != psz[j])
        {
            return false;
        }
        i++;
        j--;
    }
    return true;

}
Run Code Online (Sandbox Code Playgroud)

// STL字符串版本:

bool IsPalindrome(const string& str)
{
    if (str.empty())
        return false;

    int i = 0;                // first characters
    int j = str.length() - 1; // last character

    while (i < j)
    {
        if (str[i] != str[j])
        {
            return false;
        }
        i++;
        j--;
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

  • 你真的认为上面的代码是混淆的吗?Cubbi的解决方案只是STL功夫.没有错.但上面的代码是问题的经典解决方案 - 只是不使用STL.为了让你开心,我将展示相同解决方案的合理STL变体. (6认同)
  • 抱歉,这个问题被标记为C++ _and_在这种情况下,没有理由产生这样的混淆代码(_ever_?).请参阅[Cubbi的答案](http://stackoverflow.com/a/8362657/85371)以获得即时证据 (4认同)
  • 你写的代码是C++,不是STL。STL 意味着使用 STL 特性,例如迭代器和算法。你一个都不用。C++ 特性(一般而言)在于字符串是具有托管生命周期和分配的一流对象。此外,字符串包含空字符也没有问题。我的观点:_即使你不喜欢 STL,使用 C++ 风格的好处已经很明显了;应该没有理由使用 `char*` 和 `strlen`(因为它们更容易出错且不太灵活)_ (2认同)