C ++算法简单的递归回文检查器

时间:2014-01-23 03:31:33

标签: c++ recursion

我写了一个字符串回文检查器,我的导师说它比它需要的更复杂。我已经阅读了类似的线程并且用Google搜索了,但我完全不知道如何使用比此更少的步骤来使用它...

void isPal(string str){
int length = str.length();
if(length <= 1) cout << "Palindrome" << endl;//check for zero or one digit numbers
else if(str.at(0) == str.at(length -1)) {
    str = str.substr(1, (length - 2));
    isPal(str);}
else cout << "Not a palindrome." << endl;{
    cin >> str;}

6 个答案:

答案 0 :(得分:5)

使用递归

如果您仍想使用递归,请执行以下操作:

bool isPal(const string &str, int start, int end)
{
    if (start >= end)   
        return true;
    if (str[start] != str[end])
        return false;
    return isPal(str, ++start, --end);   
}

并在主体中致电isPal(str, 0, str.length()-1)。我们的想法是使用两个索引并移动它们,因为每次递归时都不想使用substr()

没有递归

实际上,如果不使用递归,这个问题很容易,如下所示:

bool isPal(const string &str)
{
    int start=0, end=str.length()-1;
    while (start < end) {
        if (str[start++] != str[end--]) 
            return false;
    }
    return true;
}

答案 1 :(得分:4)

检查一下:

int is_pal(int start, int end, string &str)
{
    if (start >= end)
        return 1;
    if (str[start] != str[end])
        return 0;
    return is_pal(++start, --end, str);   
}

从main调用方法。如果有帮助,请告诉我.. :)

答案 2 :(得分:2)

它应该是一个返回true或false的函数,而不是打印消息。该参数应该是单个字符串对象。

bool isPalindrome( const std::string & word ){
  std::string::const_iterator fwd = word.begin();
  std::string::const_iterator rev = word.end();
  if( rev - fwd <= 1 ) return true;
  if( *fwd++ != *--rev ) return false;
  return isPalindrome( std::string( fwd, rev ) );
}

<强>后来

因此,带有单个参数递归解决方案需要每个递归的新字符串对象。这被批评为“可怕” - 但它真的吗?必须根据预期的域来判断算法。

我们假设这个域名是英语单词。英语中有超过1.000,000个单词但是回文数小于200.因此递归必须一直到N / 2次迭代的概率几乎可以忽略不计。此外,具有相等的第一个和最后一个字母的单词的百分比非常小,因此在大多数情况下甚至不需要单个递归。

另一个可能的域是由字母“a”到“z”组成的随机字符串:超过96%甚至不需要单个递归调用。 “可怕”?几乎不

如果有人想要避免这种“恐怖”,可以有三种选择:避免递归,使用第二种方法(从第一种方法调用)或需要多个参数。

第三种变体是由其他人提出的,需要不少于三个参数,要求用户提供冗余信息,其中包含相当混乱的呼叫,例如:

string word = "evitative";
bool res = isPal( word, 0, word.length()-1 );

不是很讨人喜欢,是吗? - 但是人们可以做得更好!

bool isPal2( string::const_iterator fwd, string::const_iterator rev ){
    return rev - fwd <= 1 || *fwd++ == *--rev && isPal2( fwd, rev );
}

通过适度复杂的电话:

string word = "reviver";
bool res = isPal2( word.begin(), word.end() );

现在我们已经避免了创建字符串对象,即使是在极少数情况下也会以一个额外参数为代价的回文或“回文”,至少没有多余的信息。

答案 3 :(得分:0)

嗯让它不是递归的尝试

int i = 0;
int j = str.length() - 1;
bool isPalindrome = true;

while(i < j && isPalindrome)
{
   if(str[i++] != str[j--]) isPalindrome = false;
}

答案 4 :(得分:0)

如果您正在尝试检查字符串是否为回文,您可以轻松地执行以下操作:

  1. 将字符串插入向量假设v
  2. 反转 vector v并将其插入另一个名为suppose v1的向量中。
  3. 如果v == v1,那么回文,否则不是。
  4. 我刚才提出了一种检查回文的方法。没别的。

答案 5 :(得分:-2)

bool isPalindrome(char str[], int i) {

    int x=(strlen(str)-i);
       if (i==0) {
      return true;
   }
   if (str[x]!=str[i-1]) {
      return false;
   }
   return isPalindrome(str, i-1);
}