反向字符串的任何其他方式不使用数组?

时间:2011-04-21 19:13:05

标签: c++ algorithm

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 个答案:

答案 0 :(得分:9)

#include <string>
using std::string;
using std::getline;

#include <algorithm>
using std::mismatch;

#include <iostream>
using std::cin;
using std::cout;

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

    if(equal(s.begin(), s.end(), s.rbegin()))

        cout << s << " is a palindrome\n";
    else
        cout << s << " is not a palindrome\n";
}

没有数组,没有指针。

答案 1 :(得分:8)

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 :(得分:2)

我的解决方案:(虽然效率不高,但又是另一种“不同”的解决方案)

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

在c ++ 11之后,可变参数模板带来了新的不错的功能来解决此类问题。使用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;
}

答案 5 :(得分:0)

你问过你在标题中倒转一个字符串,但看起来你正在检查回文?

有一些集合类可以使用。

您可以使用std:map实现反向访问。将字母存储为数字索引和单个字符对。当你创建地图时,给它一个排序功能,通过在字母索引上向后排序,以相反的顺序对它们进行排序。

如果您确实需要更改列表中字母的顺序,那么您可以将这些相同的对放入std:vector并使用相同的技巧使用两个 不同的比较功能。

最有效的方法可能就是你已经拥有的。前两个 方法对此任务有很多不必要的开销。

答案 6 :(得分:0)

如果您只是想检查回文,可以使用迭代器。

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

答案 7 :(得分:0)

你可以尝试一下:

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)时间复杂度。