C ++ Palindrome检查解决方案因一个测试用例而跳闸

时间:2019-05-30 20:17:56

标签: c++ arrays string algorithm palindrome

给出字符串s,检查是否有可能通过删除AT MOST一个字符来使其成为回文(意味着零删除是可以接受的)。字符串s将包含<50,000个小写字母字符。

我在下面编写的代码通过了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;
};

1 个答案:

答案 0 :(得分:2)

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

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