代码之家  ›  专栏  ›  技术社区  ›  Huzaifa Siddiqui

我希望我的第二个if语句执行递归类型循环,但它没有返回任何内容,并且默认为false,我做错了什么?

  •  -2
  • Huzaifa Siddiqui  · 技术社区  · 3 月前
    bool isPalindrome(string some_string) {
        if (some_string.length() == 0 || some_string.length() == 1) {
            return true;
        }
    
        if (some_string[0] == some_string[some_string.length() - 1]) {
            return isPalindrome(some_string.substr(1, some_string.length() - 1));
        }
    
        else {
            return false;
        }
    }
    

    首先,此代码用于检查字符串是否为回文。我查找了一些链接,认为我可以使用substr来获取第一个索引之后和最后一个字符索引之前的字符,我做错了什么?这是我第一次来这里,所以如果这个问题没有很好地提出,我很抱歉。

    2 回复  |  直到 3 月前
        1
  •  3
  •   Remy Lebeau    3 月前

    代码的问题在于 substr() 正在以错误的方式使用。这里有一个链接 cppreference 有关于这个方法的完整文档。但简单地说,问题是这个方法的第二个参数不是子字符串的最后一个索引,而是应该包含在子字符串中的字符数 if ,使用相同的字符串调用递归,但不使用第一个字母。所以,对于字符串 "abba" ,它将执行 isPalindrome("bba") 而不是 isPalindrome("bb") .

    要执行您打算执行的操作,您必须更改以下行:

    return isPalindrome(some_string.substr(1, some_string.length() - 1));
    

    改为:

    return isPalindrome(some_string.substr(1, some_string.length() - 2));
    
        2
  •  0
  •   Casey    3 月前

    对于子孙后代,这里有一个使用迭代器的实现。非常便宜的长串和非常快。作为奖励,它只有五行代码:

    #include <iostream>
    #include <string>
    
    bool isPalindrome(std::string::const_iterator begin, std::string::const_iterator end) noexcept;
    
    int main()
    {
        std::string abba{"amanaplanacanalpanama"};
        return isPalindrome(std::cbegin(abba), std::cend(abba));
    }
    
    bool isPalindrome(std::string::const_iterator begin, std::string::const_iterator end) noexcept {
        if(begin == end) return true;
        if(end < begin) return false;
        const auto b = *begin;
        const auto e = *(end - 1);
        return (b == e) ? ( begin != (end - 1) ? isPalindrome(++begin, --end) : true) : false;
    }
    
        3
  •  0
  •   Konstantin Makarov    3 月前

    这样做会更好:

    #include <iostream>
    
    using namespace std;
    
    bool isPalindrome(string::const_iterator begin, string::const_iterator end) {
        while (begin < end) if (*(begin++) != *(--end)) return false;
        return true;
    }
    
    int main() {
        string s;
        s = "ABBA";  cout << isPalindrome(s.cbegin(), s.cend()) << endl;
        s = "ABCA";  cout << isPalindrome(s.cbegin(), s.cend()) << endl;
        s = "ABCBA"; cout << isPalindrome(s.cbegin(), s.cend()) << endl;
        s = "C";     cout << isPalindrome(s.cbegin(), s.cend()) << endl;
        s = "";      cout << isPalindrome(s.cbegin(), s.cend()) << endl;
        s = "BC";    cout << isPalindrome(s.cbegin(), s.cend()) << endl;
    }