Любой другой способ перевернуть строку без использования массива? - PullRequest
6 голосов
/ 21 апреля 2011
int main()  
{  
    clrscr();  
    char c[80],d[80];  
    cout<<"Enter a string = ";  
    cin.get(a,80);  
    strcpy(c,a);  
    strrev(a);  
    if(strcmp(c,a)==0)  
         cout<<"String = "<<c<< "is palindrome.";  
    else  
         cout<<c<<" is not palindrome";  
    getch();  
    return 0;
}

так есть ли другой способ выполнить эту задачу простым способом без использования массива или другим способом?

Ответы [ 8 ]

10 голосов
/ 21 апреля 2011
#include <string>
#include <algorithm>
#include <iostream>

int main()
{
    std::string s;
    getline(std::cin, s);

    if (std::equal(s.begin(), s.end(), s.rbegin()))
        std::cout << s << " is a palindrome\n";
    else
        std::cout << s << " is not a palindrome\n";
}

Нет массивов, нет указателей.

8 голосов
/ 21 апреля 2011
bool is_palindrome(const char* s)
{
    const char *p = s;
    const char *q = s + strlen(s) - 1;
    while (p < q) {
        if (*p != *q)
            return false;
        ++p;
        --q;
    } 
    return true;
}
2 голосов
/ 21 апреля 2011

Мое решение: (не то, чтобы оно было эффективным, но просто еще одно "другое" решение)

bool is_palindrome(const std::string& s) 
{
   struct local
   {
        static bool work(const std::string& s, int l, int h) 
        {
           return l>= h? true: (s[l] == s[h]? work(s, l + 1, h -1): false);
        }
    };
    return local::work(s, 0, s.size() - 1);
}

//usage
cout << is_palindrome("liril"); //just pass one argument. that's it!

Демо: http://www.ideone.com/WNuEC

1 голос
/ 25 июня 2019

После c ++ 11 в шаблоне variadic появилась новая замечательная функция для решения подобных проблем.С c ++ 17 решение стало еще лучше.

Вот мой вариационный шаблон через складывающееся выражение для палиндрома:

template <typename ...ARG>
bool isPalindrome(ARG ...args)
{
    std::string temp1 = "";
    ((temp1 += args), ...);

    std::string temp2 = "";
    ((temp2 = args  + temp2), ...);

    return temp1 == temp2;
}

int main(int argc, char *argv[])
{
    std::cout << isPalindrome('e','y', ' ', 'e', 'd','i','p',' ','a','d','a','n','a','d','a',' ','p','i','d','e',' ','y','e') << std::endl;
    return 0;
}
0 голосов
/ 25 мая 2011
public static void palindrome(string a)
        {
            bool y = true;
            for (int i = 0; i <= ((a.Length) / 2) && y; y = a[++i] == a[a.Length - (i + 1)]) ;
            Console.WriteLine(y ? "Palindrome" : "Not Palindrome");
        }
0 голосов
/ 22 апреля 2011

Вы можете попробовать это:

int isPalin ( char *str ) {
    int i, len=strlen(str);
    for (i=0; i<len/2; ++i)
        if (str[i]!=str[len-i-1])
            break;
    return i==len/2;
}

Это чистый C и довольно эффективный.Требуется O (1) памяти и O (n) временной сложности.

0 голосов
/ 21 апреля 2011

Вы можете использовать итераторы, если вы просто хотите проверить палиндромы.

> #include <string> using std::string; using std::getline;
> 
> #include <iostream> using std::cin; using std::cout;
> 
> int main() {
>     string s;
>     getline(cin, s);
> 
>     string::reverse_iterator rit;
>     string::iterator it=s.begin();
>     for(rit=s.rbegin(); rit<s.rend(); rit++)
>     {
>        if(*rit==*it)
>           it++;
>        else
>        {
>           cout << s << " is not a palindrome\n";
>           exit(0);
>        }
> 
>     }
> 
>     cout << s << " is a palindrome\n";
>     exit(0);
> 
>   }
0 голосов
/ 21 апреля 2011

Вы спрашивали об обращении строки в заголовке, но похоже, что вы проверяете палиндромы?

Есть несколько классов коллекций, которые будут работать.

Вы можете реализовать обратный доступиспользуя std: map.Храните буквы в виде пар числовых индексов и отдельных символов.Когда вы создаете карту, дайте ей функцию сортировки, чтобы упорядочивать их в обратном порядке, сортируя в обратном порядке по индексу буквы.

Если вам действительно нужно изменить порядок букв в списке, вы можете поместить те же самыеобъедините их в std: vector и примените их, используя один и тот же прием, но с двумя различными функциями сравнения.

Наиболее эффективный способ сделать это, вероятно, то, что у вас уже есть.У двух предыдущих методов есть много ненужных накладных расходов для этой задачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...