rustgym/leetcode/
_420_strong_password_checker.rs1struct Solution;
2
3impl Solution {
4 fn strong_password_checker(s: String) -> i32 {
5 let mut missing = 3;
6 let s: Vec<char> = s.chars().collect();
7 if s.iter().any(|c| c.is_lowercase()) {
8 missing -= 1;
9 }
10 if s.iter().any(|c| c.is_uppercase()) {
11 missing -= 1;
12 }
13 if s.iter().any(|c| c.is_digit(10)) {
14 missing -= 1;
15 }
16 let mut replace = 0;
17 let mut one = 0;
18 let mut two = 0;
19 let mut three = 0;
20 let mut i = 2;
21 while i < s.len() {
22 if s[i] == s[i - 1] && s[i] == s[i - 2] {
23 let mut length = 2;
24 while i < s.len() && s[i] == s[i - 1] {
25 length += 1;
26 i += 1;
27 }
28 replace += length / 3;
29 if length % 3 == 0 {
30 one += 1;
31 } else if length % 3 == 1 {
32 two += 1;
33 } else {
34 three += 1;
35 }
36 } else {
37 i += 1;
38 }
39 }
40 if s.len() < 6 {
41 return missing.max(6 - s.len()) as i32;
42 }
43 if s.len() <= 20 {
44 return missing.max(replace) as i32;
45 }
46
47 let delete = s.len() - 20;
48 let delete_one = one.min(delete);
49 let delete_one_left = delete - delete_one;
50 let delete_two = (two * 2).min(delete_one_left);
51 let delete_two_left = delete_one_left - delete_two;
52 let delete_three = ((one + two + three) * 3).min(delete_two_left);
53 replace -= delete_one + delete_two / 2 + delete_three / 3;
54 (delete + missing.max(replace)) as i32
55 }
56}
57
58#[test]
59fn test() {
60 let s = "aaa111".to_string();
61 let res = 2;
62 assert_eq!(Solution::strong_password_checker(s), res);
63 let s = "ABABABABABABABABABAB1".to_string();
64 let res = 2;
65 assert_eq!(Solution::strong_password_checker(s), res);
66 let s = "1Abababcaaaabababababa".to_string();
67 let res = 2;
68 assert_eq!(Solution::strong_password_checker(s), res);
69}