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