解题思路
这是一道字符串处理问题,主要思路如下:
-
问题分析:
- 给定一个字符串,长度不超过10
- 判断是否能通过删除一个字符使其变成回文串
- 需要考虑所有可能的删除位置
-
解决方案:
- 遍历每个位置,尝试删除该位置的字符
- 判断删除后的字符串是否为回文串
- 如果存在一种删除方案可以得到回文串,则返回
YES
- 否则返回
NO
-
实现细节:
- 使用双指针判断回文串
- 临时存储删除字符后的字符串
- 处理边界情况
代码
#include <iostream>
#include <string>
using namespace std;
// 判断字符串是否为回文串
bool isPalindrome(const string& str) {
int left = 0, right = str.length() - 1;
while (left < right) {
if (str[left] != str[right]) {
return false;
}
left++;
right--;
}
return true;
}
// 判断是否可以通过删除一个字符得到回文串
bool canBePalindrome(const string& str) {
int n = str.length();
// 尝试删除每个位置的字符
for (int i = 0; i < n; i++) {
string temp;
// 构造删除第i个字符后的字符串
for (int j = 0; j < n; j++) {
if (j != i) {
temp += str[j];
}
}
// 判断是否为回文串
if (isPalindrome(temp)) {
return true;
}
}
return false;
}
int main() {
string s;
while (cin >> s) {
cout << (canBePalindrome(s) ? "YES" : "NO") << endl;
}
return 0;
}
import java.util.*;
public class Main {
// 判断字符串是否为回文串
static boolean isPalindrome(String str) {
int left = 0, right = str.length() - 1;
while (left < right) {
if (str.charAt(left) != str.charAt(right)) {
return false;
}
left++;
right--;
}
return true;
}
// 判断是否可以通过删除一个字符得到回文串
static boolean canBePalindrome(String str) {
int n = str.length();
// 尝试删除每个位置的字符
for (int i = 0; i < n; i++) {
StringBuilder temp = new StringBuilder();
// 构造删除第i个字符后的字符串
for (int j = 0; j < n; j++) {
if (j != i) {
temp.append(str.charAt(j));
}
}
// 判断是否为回文串
if (isPalindrome(temp.toString())) {
return true;
}
}
return false;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String s = sc.next();
System.out.println(canBePalindrome(s) ? "YES" : "NO");
}
sc.close();
}
}
def is_palindrome(s: str) -> bool:
"""判断字符串是否为回文串"""
left, right = 0, len(s) - 1
while left < right:
if s[left] != s[right]:
return False
left += 1
right -= 1
return True
def can_be_palindrome(s: str) -> bool:
"""判断是否可以通过删除一个字符得到回文串"""
n = len(s)
# 尝试删除每个位置的字符
for i in range(n):
# 构造删除第i个字符后的字符串
temp = s[:i] + s[i+1:]
# 判断是否为回文串
if is_palindrome(temp):
return True
return False
def main():
while True:
try:
s = input().strip()
print("YES" if can_be_palindrome(s) else "NO")
except EOFError:
break
if __name__ == "__main__":
main()
算法及复杂度
- 算法:字符串处理 + 双指针
- 时间复杂度: - 为字符串长度
- 空间复杂度: - 需要存储临时字符串