import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param password string字符串
     * @param k int整型
     * @return bool布尔型
     */
    public boolean isValidPalindrome (String password, int k) {
        // 先利用hashSet进行去重处理
        HashSet<Character> hashSet = new HashSet<>();
        for (int i = 0; i < password.length(); i++) {
            char c = password.charAt(i);
            hashSet.add(c);
        }
        // 如果单个字符的数量比k大,肯定不是,返回false
        if (hashSet.size() > k) {
            return false;
        }
        int low = 0, high = password.length() - 1;
        // 类似双指针,进行回文判断
        while (low < high) {
            // 如果密码正好是回文,比如abcba,那么一直走if语句,然后跳出
            if (password.charAt(low) == password.charAt(high)) {
                low++;
                high--;
            } else {
                // else是用来判断删除一个字符,要么去掉前面,要么去掉后面,只要有一个满足回文即返回true
                return vaild(password, low, high - 1) || vaild(password, low + 1, high);
            }
        }
        return  true;

    }

    /**
     * low-high区间回文判断
     * @param s
     * @param low
     * @param high
     * @return
     */
    public boolean vaild(String s, int low, int high) {
        for (int i = low, j = high; i < j; i++, --j) {
            if (s.charAt(i) != s.charAt(j)) {
                return false;
            }
        }
        return true;
    }
}

本题知识点分析:

1.字符串回文判断

2.双指针

3.哈希表去重

4.数学模拟

本题解题思路分析:

1.先利用hashSet进行去重处理

2.如果单个字符的数量比k大,肯定不是,返回false

3.如果密码正好是回文,比如abcba,那么一直走if语句,然后跳出

4.else是用来判断删除一个字符,要么去掉前面,要么去掉后面,只要有一个满足回文即返回true

本题使用编程语言: Java