//题目:
//给定一个非空字符串 s,最多删除一个字符。判断是否能够通过删除一个字符使得字符串成为回文字符串。
//
//问题函数定义:
//
//cpp
//bool validPalindrome(string s);
//1.使用穷举法,判断删除所有可能位置后是否是回文串
//裁判测试程序样例:
//cpp
#include <iostream>
#include <string>
using namespace std;
bool ish(string s) {
int l = 0;
int r = s.size() - 1;
while (l < r) {
if (s[l] != s[r])
return false;
l++;
r--;
}
return true;
}
bool validPalindrome(string s) {
if (ish(s))
return true;
for (int i = 0; i < s.size(); i++) {
string b = s;
s.erase(s.begin() + i);
if (ish(s))
return true;
s = b;
}
return false;
}
int main() {
string input = "abca";
bool result = validPalindrome(input);
if (result) {
cout << "The string can be made palindrome by removing at most one character." << endl;
}
else {
cout << "The string cannot be made palindrome by removing at most one character." << endl;
}
return 0;
}
//输入样例:
//"abca"
//输出样例:
//The string can be made palindrome by removing at most one character.
//2.双指针法,推荐使用
bool validPalindrome(string s) {
int left = 0;
int right = s.size() - 1;
while (left <= right) {
if (s[left] != s[right]) {
// 尝试删除左边或右边的字符
return isPalindrome(s, left + 1, right) || isPalindrome(s, left, right - 1);
}
left++;
right--;
}
return true;
}
bool isPalindrome(const string& s, int left, int right) {
while (left <= right) {
if (s[left] != s[right]) {
return false;
}
left++;
right--;
}
return true;
}