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; } 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代码
该题考察的主要知识点包括:
- 字符串处理:使用字符串的方法来处理密码中的字符。
- 数据结构:使用集合(HashSet)来存储不同的字符,以及在处理过程中判断字符是否出现过。
- 循环和条件判断:使用循环和条件判断来检查密码是否满足题目的条件。
代码解释:
- 使用 HashSet 存储密码中的不同字符,以便检查字符种类的数量是否超过 k。
- 首先判断集合中的字符种类数是否超过了 k,如果是,直接返回 false。
- 使用双指针 i 和 j 来比较密码的字符,t 作为标志位,记录是否已经删除了一个字符。
- 在循环中,如果 password.charAt(i) == password.charAt(j),表示当前字符是回文的一部分,移动指针并继续比较。
- 如果当前字符不相等,首先判断是否已经删除过字符,如果是,则无法满足条件,返回 false。
- 如果没有删除过字符,判断能否通过删除一个字符构成回文。具体判断条件是检查删除 password.charAt(j) 后是否能够构成回文,或者删除 password.charAt(i) 后是否能够构成回文。如果都不满足,则返回 false。
- 如果循环结束后没有返回 false,则表示密码满足条件,返回 true。