解题思路

这是一道字符串处理问题,主要思路如下:

  1. 问题分析:

    • 给定一个字符串,长度不超过10
    • 判断是否能通过删除一个字符使其变成回文串
    • 需要考虑所有可能的删除位置
  2. 解决方案:

    • 遍历每个位置,尝试删除该位置的字符
    • 判断删除后的字符串是否为回文串
    • 如果存在一种删除方案可以得到回文串,则返回 YES
    • 否则返回 NO
  3. 实现细节:

    • 使用双指针判断回文串
    • 临时存储删除字符后的字符串
    • 处理边界情况

代码

#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()

算法及复杂度

  • 算法:字符串处理 + 双指针
  • 时间复杂度: - 为字符串长度
  • 空间复杂度: - 需要存储临时字符串