【发布时间】: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 programs 和 Debugging Guide
-
你知道你可以在一行中检查回文,在一个 if 语句中,对吗? stackoverflow.com/a/8362657/2104697
-
这不是回文:单词中有一个多余的字母,倒数第二个“u”字母。
-
致最后两位评论者(@GuillaumeRacicot 和@Bianca):问题询问是否可以通过删除字母将字符串变为回文。
-
看起来这个算法总是试图从列表的前半部分删除,如果没有匹配。我很惊讶 560 个测试用例中有 458 个通过(或者我对算法的理解是错误的)。我知道 Stack Overflow 上有很多人甚至在算法问题上都坚持使用代码,但 IMO 我更希望代码至少附有自然语言描述,这样人们就可以调试算法而不是调试代码.
标签: c++ arrays string algorithm palindrome