20250502 finished.
This commit is contained in:
parent
25f8703b39
commit
c2b87c5f09
|
@ -628,3 +628,5 @@ mod p2302_count_subarrays_with_score_less_than_k;
|
||||||
mod p2962_count_subarrays_where_max_element_appears_at_least_k_times;
|
mod p2962_count_subarrays_where_max_element_appears_at_least_k_times;
|
||||||
|
|
||||||
mod p2071_maximum_number_of_tasks_you_can_assign;
|
mod p2071_maximum_number_of_tasks_you_can_assign;
|
||||||
|
|
||||||
|
mod p838_push_dominoes;
|
||||||
|
|
111
src/problem/p838_push_dominoes.rs
Normal file
111
src/problem/p838_push_dominoes.rs
Normal file
|
@ -0,0 +1,111 @@
|
||||||
|
/**
|
||||||
|
* [838] Push Dominoes
|
||||||
|
*/
|
||||||
|
pub struct Solution {}
|
||||||
|
|
||||||
|
// submission codes start here
|
||||||
|
#[derive(Debug, Eq, PartialEq, Copy, Clone)]
|
||||||
|
enum State {
|
||||||
|
Left,
|
||||||
|
Right,
|
||||||
|
Untouched,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Solution {
|
||||||
|
pub fn push_dominoes(dominoes: String) -> String {
|
||||||
|
let mut dominoes: Vec<State> = dominoes
|
||||||
|
.chars()
|
||||||
|
.map(|c| match c {
|
||||||
|
'L' => State::Left,
|
||||||
|
'R' => State::Right,
|
||||||
|
'.' => State::Untouched,
|
||||||
|
_ => unimplemented!(),
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
let n = dominoes.len();
|
||||||
|
|
||||||
|
// 为双指针插入头尾伪节点
|
||||||
|
dominoes.insert(0, State::Untouched);
|
||||||
|
dominoes.push(State::Untouched);
|
||||||
|
|
||||||
|
let (mut left, mut right) = (0, 1);
|
||||||
|
|
||||||
|
// 不能判断右指针
|
||||||
|
// 左指针才是遍历完成的信息
|
||||||
|
while left <= n {
|
||||||
|
while right <= n && dominoes[right] == State::Untouched {
|
||||||
|
right += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 找到没有推动的区间(left, right)
|
||||||
|
if right - left > 1 {
|
||||||
|
let (mut inner_left, mut inner_right) = (left + 1, right - 1);
|
||||||
|
|
||||||
|
match (dominoes[left], dominoes[right]) {
|
||||||
|
(State::Untouched, State::Left) | (State::Left, State::Left) => {
|
||||||
|
while inner_left <= inner_right {
|
||||||
|
dominoes[inner_left] = State::Left;
|
||||||
|
inner_left += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
(State::Right, State::Untouched) | (State::Right, State::Right) => {
|
||||||
|
while inner_left <= inner_right {
|
||||||
|
dominoes[inner_left] = State::Right;
|
||||||
|
inner_left += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
(State::Right, State::Left) => {
|
||||||
|
while inner_left < inner_right {
|
||||||
|
// 注意需要同时修改
|
||||||
|
let l = Self::between_left_right(&mut dominoes, inner_left);
|
||||||
|
let r = Self::between_left_right(&mut dominoes, inner_right);
|
||||||
|
dominoes[inner_left] = l;
|
||||||
|
dominoes[inner_right] = r;
|
||||||
|
inner_left += 1;
|
||||||
|
inner_right -= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
left = right;
|
||||||
|
right += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
dominoes[1..=n]
|
||||||
|
.iter()
|
||||||
|
.map(|x| match x {
|
||||||
|
State::Left => 'L',
|
||||||
|
State::Right => 'R',
|
||||||
|
State::Untouched => '.',
|
||||||
|
})
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn between_left_right(dominoes: &mut Vec<State>, pos: usize) -> State {
|
||||||
|
match (dominoes[pos - 1], dominoes[pos + 1]) {
|
||||||
|
(State::Right, State::Untouched) => State::Right,
|
||||||
|
(State::Untouched, State::Left) => State::Left,
|
||||||
|
// 其他情况都不会影响中间的
|
||||||
|
_ => dominoes[pos],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// submission codes end
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_838() {
|
||||||
|
assert_eq!("LL.RR", Solution::push_dominoes(".L.R.".to_owned()));
|
||||||
|
assert_eq!("RR.L", Solution::push_dominoes("RR.L".to_owned()));
|
||||||
|
assert_eq!(
|
||||||
|
"LL.RR.LLRRLL..",
|
||||||
|
Solution::push_dominoes(".L.R...LR..L..".to_owned())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user