寻找回文

Find Palindrome

我想找到一个单词的回文。这里有什么问题?

主要功能:

  int size;
  string input;
  cin>>input;
  size = input.length();  
  if(testPalindrome(input,size-1,0))
    cout<<"It's Palindrome";
  else
    cout<<"It's not Palindrome";

测试回文函数是:

bool testPalindrome (string pal , int last, int first){

    if (pal[first] != pal[last])
        return false;
    else{
        if (first<last)
            testPalindrome(pal,last-1,first+1);
        else
            return true;
    }
}

我已经阅读 this link 并找到了确定回文的答案,但为什么这个不起作用?

您需要return递归调用的结果,就像调用任何其他函数一样。

如果不这样做,则行为未定义。

我想你忘记了函数中的 return 语句

    if (first<last)
        return testPalindrome(pal,last-1,first+1);
        ^^^^^^^

通常一个范围的第一个参数指定下限值,第二个参数指定不包括在范围内的上限值或序列中元素的数量..

并且第一个参数应该声明为常量引用类型,因为字符串本身没有改变,你将逃避额外的内存分配。

递归函数可以这样写

#include <iostream>
#include <string>

bool testPalindrome(const std::string &s,
    std::string::size_type i,
    std::string::size_type n)
{
    return n < 2 || (s[i] == s[n-1] && testPalindrome(s, i + 1, n - 2) );
}

int main()
{
    std::cout << testPalindrome("abba", 0, 4) << std::endl;
    std::cout << testPalindrome("aba", 0, 3) << std::endl;
    std::cout << testPalindrome("aa", 0, 2) << std::endl;
    std::cout << testPalindrome("a", 0, 1) << std::endl;
    std::cout << testPalindrome("ab", 0, 2) << std::endl;

    return 0;
}

程序输出为

1
1
1
1
0

检查 std::string 类型的对象是否为回文的最简单方法是编写表达式

s == std::string( s.rbegin(), s.rend() )