1249. 密码强度检查器
当以下条件都满足时,一个密码被视为是强密码:
-
至少包含6个字符,但不超过20个字符。
-
至少包含一个小写字母,一个大写字母,和一个数字。
-
不能包含三个连续的重复字符("...aaa..."是弱密码,但"...aa...a..."是强密码,假设它们的其他条件都满足了)。
写一个函数strongPasswordChecker(s),它将一个字符串s作为输入,并且返回将其转换成强密码需要的最少改变次数。如果s已经是一个强密码了,返回0。
插入、删除或者替换任意一个字符都视为一次改变。
样例
样例 1:
输入:"aaa123"
输出:1
解释:"aaa123"->"aaA123"
样例 2:
输入:"a"
输出:5
解释:"a"->"aa"->"aaA"->"aaA1"->"aaA12"->"aaA123"
//至少包含6个字符,但不超过20个字符。
//至少包含一个小写字母,一个大写字母,和一个数字。
//不能包含三个连续的重复字符("...aaa..."是弱密码,但"...aa...a..."是强密码,假设它们的其他条件都满足了)。
/**
* @param s: a string
* @return: return an integer
*/
public int strongPasswordChecker(String s) {
int sum = 0;
boolean up = true, down = true, num = true;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c >= '0' && c <= '9') {
num = false;
} else if (c >= 'A' && c <= 'Z') {
down = false;
} else if (c >= 'a' && c <= 'z') {
up = false;
}
}
if (up) {
sum++;
}
if (down) {
sum++;
}
if (num) {
sum++;
}
int ll = 0;
if (s.length() < 6) {
sum = Math.max(sum, 6 - s.length());
} else if (s.length() > 20) {
ll = s.length() - 20;
}
List<Integer> list = new ArrayList<>();
int flag = 1;
int size = 0;
for (int i = 1; i < s.length(); i++) {
if (s.charAt(i) == s.charAt(i - 1)) {
flag++;
} else {
if (flag > 2) {
list.add(flag);
}
flag = 0;
}
}
if (flag > 2) {
list.add(flag);
}
sum += ll;
if (list.size() > 0) {
for (int i = 0; i < 3 && ll > i; i++) {
for (int j = 0; j < list.size(); j++) {
if (list.get(j) % 3 == i) {
ll--;
list.set(i, list.get(j) - 1);
}
}
}
for (int j = 0; j < list.size(); j++) {
size += list.get(j) / 3;
}
if (size >= 3) {
sum += size - 2;
}
}
return sum;
}