Skip to content

Commit 94b466d

Browse files
committed
night_match_27
1 parent d607bb1 commit 94b466d

File tree

5 files changed

+210
-0
lines changed

5 files changed

+210
-0
lines changed

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,7 @@ mod crack_code_interview;
433433
mod sort;
434434
mod kmp;
435435
mod trans_tree;
436+
mod night_match_27;
436437
#[cfg(test)]
437438
mod tests {
438439
#[test]

src/night_match_27/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
mod prob_5409;
2+
mod prob_5410;
3+
mod prob_5411;

src/night_match_27/prob_5409.rs

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
use std::collections::HashSet;
2+
3+
impl Solution {
4+
pub fn has_all_codes(s: String, k: i32) -> bool {
5+
if s.is_empty() {
6+
return false;
7+
}
8+
if k >= s.len() as i32 {
9+
return false;
10+
}
11+
let bs = s.as_bytes();
12+
if k == 1 {
13+
let mut one = false ;
14+
let mut zero = false;
15+
for &c in bs {
16+
if c == b'0' {
17+
zero = true;
18+
} else {
19+
one = true;
20+
}
21+
if zero && one {
22+
return true;
23+
}
24+
}
25+
return false;
26+
}
27+
let mut v = 0;
28+
for i in 0..k as usize {
29+
v = (v << 1) | ((bs[i]-b'0') as i32);
30+
}
31+
let mut hash = HashSet::new();
32+
hash.insert(v);
33+
let mask = (1 << (k-1)) - 1;
34+
for i in k as usize..bs.len() {
35+
v = ((v & mask) << 1) | ((bs[i]-b'0') as i32);
36+
hash.insert(v);
37+
}
38+
for i in 0..=(1<<k)-1 {
39+
if !hash.contains(&i) {
40+
return false;
41+
}
42+
}
43+
true
44+
}
45+
}
46+
47+
struct Solution;
48+
49+
#[cfg(test)]
50+
mod tests {
51+
use super::Solution;
52+
53+
#[test]
54+
fn test_has_all_codes() {
55+
let test_cases = vec![
56+
("00110", 2, true),
57+
("0110", 1, true),
58+
("0000000001011100", 4, false),
59+
("00110110", 2, true),
60+
];
61+
for (s, k, ok) in test_cases {
62+
assert_eq!(Solution::has_all_codes(s.to_string(), k), ok, "s:{}, k:{}", s,k);
63+
}
64+
}
65+
}

src/night_match_27/prob_5410.rs

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
use std::collections::{HashMap, HashSet};
2+
3+
impl Solution {
4+
pub fn check_if_prerequisite(n: i32, prerequisites: Vec<Vec<i32>>, queries: Vec<Vec<i32>>) -> Vec<bool> {
5+
let mut graph = HashMap::new();
6+
for v in prerequisites.iter() {
7+
let (to, from) = (v[0], v[1]);
8+
graph.entry(from as usize).or_insert(HashSet::new()).insert(to as usize);
9+
}
10+
let mut father = HashMap::new();
11+
for i in 0..n as usize {
12+
let f = Self::get_father(n as usize, i, &graph);
13+
father.insert(i, f);
14+
}
15+
let mut ans = vec![];
16+
for q in queries {
17+
let (to, from) = (q[0] as usize, q[1] as usize);
18+
if let Some(set) = father.get(&from) {
19+
ans.push(set.contains(&to));
20+
}
21+
}
22+
ans
23+
}
24+
fn get_father(n: usize, s: usize, graph: &HashMap<usize, HashSet<usize>>) -> HashSet<usize> {
25+
let mut went = vec![false; n];
26+
went[s] = true;
27+
let mut ans = HashSet::new();
28+
let mut q = vec![s];
29+
let mut head = 0;
30+
while head < q.len() {
31+
let cur = q[head];
32+
head += 1;
33+
if let Some(set) = graph.get(&cur) {
34+
for &next in set.iter() {
35+
if !went[next] {
36+
went[next] = true;
37+
ans.insert(next);
38+
q.push(next);
39+
}
40+
}
41+
}
42+
}
43+
ans
44+
}
45+
}
46+
47+
struct Solution;
48+
49+
#[cfg(test)]
50+
mod tests {
51+
use super::Solution;
52+
53+
#[test]
54+
fn test_check_if_prerequisite() {
55+
let test_cases = vec![
56+
(3, vec![[1,2],[1,0],[2,0]], vec![[1,0],[1,2]], vec![true, true]),
57+
(5, vec![[0,1],[1,2],[2,3],[3,4]], vec![[0,4],[4,0],[1,3],[3,0]], vec![true,false,true,false]),
58+
];
59+
for (n, pre, q, expect) in test_cases {
60+
let pres = pre.iter().map(|v| vec![v[0], v[1]]).collect();
61+
let qs = q.iter().map(|v| vec![v[0], v[1]]).collect();
62+
assert_eq!(Solution::check_if_prerequisite(n, pres, qs), expect, "n:{}, pres: {:?}, qs: {:?}", n, pre, q);
63+
}
64+
}
65+
}

src/night_match_27/prob_5411.rs

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
impl Solution {
2+
pub fn cherry_pickup(grid: Vec<Vec<i32>>) -> i32 {
3+
let n = grid.len();
4+
let m = grid[0].len();
5+
let mut f = vec![vec![vec![-1; m]; m]; n];
6+
f[0][0][m-1] = grid[0][0] + grid[0][m-1];
7+
let im = m as i32;
8+
for t in 1..n {
9+
for i in 0..im {
10+
for j in 0..im {
11+
for di in -1..=1 {
12+
for dj in -1..=1 {
13+
let (ni, nj) = (i+di, j+dj);
14+
if ni < 0 || nj < 0 || ni >= im || nj >= im { continue; }
15+
let (ui, uj) = (ni as usize, nj as usize);
16+
if f[t-1][ui][uj] < 0 { continue; }
17+
let ci = i as usize;
18+
let cj = j as usize;
19+
if i != j {
20+
f[t][ci][cj] = f[t][ci][cj].max(f[t-1][ui][uj] + grid[t][ci] + grid[t][cj]);
21+
} else {
22+
f[t][ci][cj] = f[t][ci][cj].max(f[t-1][ui][uj] + grid[t][ci]);
23+
}
24+
}
25+
}
26+
}
27+
}
28+
}
29+
let mut ans = 0;
30+
for i in 0..m {
31+
for j in 0..m {
32+
ans = ans.max(f[n-1][i][j]);
33+
}
34+
}
35+
ans
36+
}
37+
}
38+
39+
struct Solution;
40+
41+
#[cfg(test)]
42+
mod tests {
43+
use super::Solution;
44+
45+
#[test]
46+
fn test_cherry_pickup() {
47+
let test_cases = vec![
48+
(vec![
49+
vec![1,0,0,3],
50+
vec![0,0,0,3],
51+
vec![0,0,3,3],
52+
vec![9,0,3,3]
53+
], 22),
54+
(vec![
55+
vec![1,1],
56+
vec![1,1]
57+
], 4),
58+
(vec![
59+
vec![3,1,1],
60+
vec![2,5,1],
61+
vec![1,5,5],
62+
vec![2,1,1]
63+
], 24),
64+
(vec![
65+
vec![1,0,0,0,0,0,1],
66+
vec![2,0,0,0,0,3,0],
67+
vec![2,0,9,0,0,0,0],
68+
vec![0,3,0,5,4,0,0],
69+
vec![1,0,2,3,0,0,6]
70+
], 28),
71+
];
72+
for (grid, expect) in test_cases {
73+
assert_eq!(Solution::cherry_pickup(grid.clone()), expect, "grid: {:?}", grid);
74+
}
75+
}
76+
}

0 commit comments

Comments
 (0)