给出字符串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;
};
答案 0 :(得分:2)
如果存在光标指向不同字母的情况,并且可以从左侧或右侧光标 删除字符,则算法只会从左侧进行删除检查。如果回文是通过从右侧删除而形成的,那么您的代码将丢失它。
因此,如果从左侧删除,则还需要检查是否可以从右侧删除,并且(可能)从左侧删除时检查是否没有回文。