rustgym/leetcode/
_420_strong_password_checker.rs

1struct 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}