Skip to content

Commit f60826c

Browse files
committed
nightly match 24
1 parent 1854f67 commit f60826c

File tree

3 files changed

+122
-0
lines changed

3 files changed

+122
-0
lines changed

src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,8 @@ mod prob_5364;
407407
mod prob_5366;
408408
mod prob_5367;
409409
mod prob_5370;
410+
mod prob_5374;
411+
mod prob_5375;
410412
mod prob_5377;
411413
mod prob_5379;
412414
mod prob_5380;

src/prob_5374.rs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
impl Solution {
2+
pub fn get_happy_string(n: i32, k: i32) -> String {
3+
let mut arr = vec![];
4+
let mut uk = k as usize;
5+
let mut ans = None;
6+
Self::dfs(0, n as usize, &mut uk, &mut arr, &mut ans);
7+
ans.unwrap_or("".to_string())
8+
}
9+
fn dfs(i: usize, n: usize, k: &mut usize, arr: &mut Vec<u8>, ans: &mut Option<String>) {
10+
if ans.is_some() {
11+
return;
12+
}
13+
if i == n {
14+
*k -= 1;
15+
if *k == 0 {
16+
*ans = Some(unsafe {std::str::from_utf8_unchecked(&arr).to_string()});
17+
}
18+
return;
19+
}
20+
for c in b'a'..=b'c' {
21+
if i > 0 && arr[i-1] == c {
22+
continue;
23+
}
24+
arr.push(c);
25+
Self::dfs(i+1, n, k, arr, ans);
26+
arr.pop();
27+
}
28+
}
29+
}
30+
31+
struct Solution;
32+
33+
#[cfg(test)]
34+
mod tests {
35+
use super::Solution;
36+
37+
#[test]
38+
fn test_get_happy_string() {
39+
let test_cases = vec![
40+
(1, 4, ""),
41+
(3, 9, "cab"),
42+
(2, 7, ""),
43+
(10, 100, "abacbabacb"),
44+
];
45+
for (n,k,expect) in test_cases {
46+
assert_eq!(Solution::get_happy_string(n, k), expect, "n:{}, k:{}",n,k);
47+
}
48+
}
49+
}

src/prob_5375.rs

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
macro_rules! val {
2+
($e: expr) => {
3+
($e-b'0') as i64
4+
};
5+
}
6+
7+
impl Solution {
8+
pub fn number_of_arrays(s: String, k: i32) -> i32 {
9+
const MOD: i64 = 1000000007;
10+
let n = s.len();
11+
let bs = s.as_bytes();
12+
let mut f = vec![0i64; n];
13+
let k = k as i64;
14+
if val!(bs[0]) > k {
15+
return 0;
16+
}
17+
f[0] = 1;
18+
for i in 1..n {
19+
let mut t = val!(bs[i]);
20+
let mut q = 1;
21+
if t > k {
22+
return 0;
23+
}
24+
if f[i-1] > 0 && t != 0{
25+
f[i] += f[i-1];
26+
}
27+
for j in (0..i).rev() {
28+
q *= 10;
29+
if q > k {
30+
break;
31+
}
32+
let w = val!(bs[j]);
33+
if w == 0 {
34+
continue;
35+
}
36+
t += w*q;
37+
if t > k {
38+
break;
39+
}
40+
if j > 0 {
41+
f[i] += f[j-1];
42+
} else if j == 0 {
43+
f[i] += 1;
44+
}
45+
}
46+
f[i] %= MOD;
47+
}
48+
f[n-1] as i32
49+
}
50+
}
51+
52+
struct Solution;
53+
54+
#[cfg(test)]
55+
mod tests {
56+
use super::Solution;
57+
58+
#[test]
59+
fn test_number_of_arrays() {
60+
let test_cases = vec![
61+
("1000", 10000, 1),
62+
("1000", 10, 0),
63+
("1317", 2000, 8),
64+
("2020", 30, 1),
65+
("1234567890", 90, 34),
66+
];
67+
for (s, k, expect) in test_cases {
68+
assert_eq!(Solution::number_of_arrays(s.to_string(), k), expect, "s: {}, k: {}",s,k);
69+
}
70+
}
71+
}

0 commit comments

Comments
 (0)