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;
}
for (int i = 0, j = password.length() - 1, t = 1; i < j; i++, j--) {
if (password.charAt(i) == password.charAt(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。
这道题考察的主要知识点包括:
- 使用集合:将字符放入集合以计算不同字符的数量,帮助判断是否满足条件。
- 字符串
- 双指针
以下是代码的解释:
- 创建一个 HashSet 对象 set,用于存储不同的字符。
- 使用循环遍历密码字符串中的每个字符,将字符添加到 set 中,从而计算不同字符的数量。
- 如果 set 中不同字符的数量大于 k,则不满足条件,返回 false。
- 创建两个指针 i 和 j,分别指向密码字符串的开头和结尾。
- 使用循环,比较字符是否相同。如果字符相同,继续遍历下一个字符。
- 如果字符不同,根据 t 的值来判断是否可以删除字符以构成回文字符串。
- 如果 t 为 1,表示可以删除一个字符,根据情况删除字符,然后更新指针 i 或 j。
- 如果 t 为 0,表示已经删除过一个字符,不再满足条件,返回 false。
- 如果循环结束后,指针交叉或重合,说明密码满足条件,返回 true。

京公网安备 11010502036488号