import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param password string字符串
     * @param k int整型
     * @return bool布尔型
     */
    public boolean isValidPalindrome (String password, int k) {
        // write code here
        HashSet<Character> set = new HashSet<>();
        for (char c : password.toCharArray()) {
            set.add(c);
        }

        if (set.size() > k) {
            return false;
        }

        int i = 0, j = password.length() - 1, t = 1;
        while (i < j) {
            if (password.charAt(i) == password.charAt(j)) {
                i++;
                j--;
                continue;
            }

            if (t == 1) {
                t = 0;
                if (password.charAt(i) == password.charAt(j - 1)) {
                    j--;
                } else if (password.charAt(i + 1) == password.charAt(j)) {
                    i++;
                } else {
                    return false;
                }
            } else {
                return false;
            }
        }

        return true;
    }
}

Java代码

该题考察的主要知识点包括:

  1. 字符串处理:使用字符串的方法来处理密码中的字符。
  2. 数据结构:使用集合(HashSet)来存储不同的字符,以及在处理过程中判断字符是否出现过。
  3. 循环和条件判断:使用循环和条件判断来检查密码是否满足题目的条件。

代码解释:

  1. 使用 HashSet 存储密码中的不同字符,以便检查字符种类的数量是否超过 k。
  2. 首先判断集合中的字符种类数是否超过了 k,如果是,直接返回 false。
  3. 使用双指针 i 和 j 来比较密码的字符,t 作为标志位,记录是否已经删除了一个字符。
  4. 在循环中,如果 password.charAt(i) == password.charAt(j),表示当前字符是回文的一部分,移动指针并继续比较。
  5. 如果当前字符不相等,首先判断是否已经删除过字符,如果是,则无法满足条件,返回 false。
  6. 如果没有删除过字符,判断能否通过删除一个字符构成回文。具体判断条件是检查删除 password.charAt(j) 后是否能够构成回文,或者删除 password.charAt(i) 后是否能够构成回文。如果都不满足,则返回 false。
  7. 如果循环结束后没有返回 false,则表示密码满足条件,返回 true。