【问题标题】:C++ Palindrome checking solution is tripped by one test caseC++回文检查解决方案被一个测试用例绊倒
【发布时间】:2019-05-30 20:17:56
【问题描述】:

给定一个字符串 s,检查是否可以通过删除最多一个字符来使其成为回文(意味着零删除是可以接受的)。字符串 s 将包含

我在下面编写的代码通过了 458/460 个测试用例,它在没有明显原因的情况下特别卡在了一个测试用例上,返回 false 而不是 true。该算法的逻辑很简单,我尝试过移动条件,但似乎没有任何改变。

class Solution {
  public:
    bool ispalindrome; //holds result
    bool validPalindrome(string s) {
        bool candelete = true; //allows one delete
        ispalindrome = true; //initial condition
        int lcursor = 0;
        int rcursor = s.length() - 1;
        while(lcursor < rcursor && ispalindrome){
            //if cursor points at different letters
            if(s[lcursor] != s[rcursor]){
                // if delete is still allowed and delete works
                if(s[lcursor + 1] == s[rcursor] && candelete){
                    lcursor++;
                    candelete = false;
                } else if (s[lcursor] == s[rcursor - 1] && candelete){
                    rcursor--;
                    candelete = false;
                } else {
                    ispalindrome = false;
                }
            }
            lcursor++;
            rcursor--;
        }
        return ispalindrome;
    }
};

触发此解决方案的测试用例如下:

aguokepatgbnvfqmgmlcupuufxoohdfpgjdmysgvhmvffcnqxjjxqncffvmhvgsymdjgpfdhooxfuupuculmgmqfvnbgtapekouga

使用此测试用例进行代码测试:

#include <iostream>
using std::string;

// class Solution { ... etc., from above

int main() {
  string s = "aguokepatgbnvfqmgmlcupuufxoohdfpgjdmysgvhmvffcnqxjjxqncffvmhvgsymdjgpfdhooxfuupuculmgmqfvnbgtapekouga";
  std::cout << Solution().validPalindrome(s) << std::endl;
};

【问题讨论】:

  • 听起来您可能需要学习如何使用调试器来单步调试您的代码。使用好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏差在哪里。如果您要进行任何编程,这是必不可少的工具。进一步阅读:How to debug small programsDebugging Guide
  • 你知道你可以在一行中检查回文,在一个 if 语句中,对吗? stackoverflow.com/a/8362657/2104697
  • 这不是回文:单词中有一个多余的字母,倒数第二个“u”字母。
  • 致最后两位评论者(@GuillaumeRacicot 和@Bianca):问题询问是否可以通过删除字母将字符串变为回文。
  • 看起来这个算法总是试图从列表的前半部分删除,如果没有匹配。我很惊讶 560 个测试用例中有 458 个通过(或者我对算法的理解是错误的)。我知道 Stack Overflow 上有很多人甚至在算法问题上都坚持使用代码,但 IMO 我更希望代码至少附有自然语言描述,这样人们就可以调试算法而不是调试代码.

标签: c++ arrays string algorithm palindrome


【解决方案1】:

如果存在光标指向不同字母的情况,并且可以从左侧或右侧光标删除一个字符,您的算法将只检查从左侧删除。如果回文是通过从右侧删除形成的,那么您的代码将错过它。

因此,如果您从左侧删除,您还需要检查是否可以从右侧删除,并且(可能)检查从左侧删除时是否没有回文。

【讨论】:

  • else if (s[lcursor] == s[rcursor - 1] &amp;&amp; candelete) 不检查是否可以从右侧删除?
  • @NathanOliver 可以,但是如果您可以从左侧删除,如果左侧删除不成功,它将不会返回并检查右侧回文。
  • 说明问题的较小测试用例:CUUCU。问题中的算法删除了最初的 C 作为 U 的匹配项,而是删除最终的 U。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-21
  • 2018-12-30
  • 2022-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多