题解 | #牛群密码 - 有效回文# java
牛群密码 - 有效回文
https://www.nowcoder.com/practice/98fad63b47544d5ebf4042fc53b54b3d
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。