Проверьте, является ли строка палиндром

Возможный дубликат:
чтобы определить, является ли данная строка палиндром или не является палиндром

Мне нужно создать программу, которая позволяет пользователю вводить строку, и моя программа будет проверять, является ли введенная им строка палиндром (слово, которое можно читать так же, как и вперед).

Ответ 1

Просто сравните строку с самим обратным:

string input;

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

if (input == string(input.rbegin(), input.rend())) {
    cout << input << " is a palindrome";
}

Этот конструктор string принимает итератор начала и окончания и создает строку из символов между этими двумя итераторами. Поскольку rbegin() - это конец строки, а приращение - назад, то строка, которую мы создаем, будет иметь символы input, добавленные к ней в обратном порядке, обращая строку.

Затем вы просто сравниваете его с input, и если они равны, это палиндром.

Это не учитывает капитализацию или пробелы, поэтому вам нужно будет улучшить ее самостоятельно.

Ответ 2

Обратите внимание, что обращение всей строки (либо с помощью rbegin() диапазона rbegin()/rend() либо с помощью std::reverse) и сравнение ее с входными rbegin() приведет к ненужной работе.

Достаточно сравнить первую половину строки со второй, наоборот:

#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";
}

демо: http://ideone.com/mq8qK

Ответ 3

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;

}

//Строковая версия 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;
}

Ответ 4

Отмените строку и проверьте, являются ли исходные строки и обратные те же или нет.

Ответ 5

Я не парень из С++, но вы должны иметь возможность получить этот текст.

public static string Reverse(string s) {
    if (s == null || s.Length < 2) {
        return s;
    }

    int length = s.Length;
    int loop = (length >> 1) + 1;
    int j;
    char[] chars = new char[length];
    for (int i = 0; i < loop; i++) {
        j = length - i - 1;
        chars[i] = s[j];
        chars[j] = s[i];
    }
    return new string(chars);
}