Кто-нибудь может проверить, если этот код Palindrome C ++ является правильным? - PullRequest
0 голосов
/ 18 июня 2019

Вот программа, которую я построил для проверки слов палиндрома в 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 ]

3 голосов
/ 18 июня 2019

Ваша функция слишком сложна.Параметр должен иметь постоянный ссылочный тип, а функция должна возвращать логическое значение.

Ниже приведена демонстрационная программа, которая показывает, как функция может выглядеть с использованием цикла.

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

Вывод программы такой же, как показано выше, и равен

* 1014.*
0 голосов
/ 18 июня 2019

Я согласен с людьми, что это что-то для Code Review, но ваш код выглядит правильно. ... а почему бы не добавить еще несколько версий палиндрома? Вот пример работы с итераторами, поэтому вы можете проверять диапазоны любого типа с помощью оператора равенства:

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());
0 голосов
/ 18 июня 2019

Да, ваша логика верна и даст правильные результаты.

0 голосов
/ 18 июня 2019

Поскольку палиндром - это строка, которая при обращении совпадает, почему бы просто не перевернуть строку с помощью 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...