главная Π½ΠΎΠ²ΠΎΠ΅ Π»ΡƒΡ‡ΡˆΠ΅Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ

БСгодня Ρƒ нас Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° Π·Π°Π΄Π°Ρ‡Π° Π½Π° Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎΠ΅ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ индСксами 2337. Move Pieces to Obtain a String.

ОписаниС Π·Π°Π΄Π°Ρ‡ΠΈ

Π”Π°Π½Ρ‹ Π΄Π²Π΅ строки start ΠΈ target Π΄Π»ΠΈΠ½Ρ‹ n, содСрТащиС символы 'L', 'R' ΠΈ '_'.

ИдСя 🧠

Π—Π°Π΄Π°Ρ‡Π° сводится ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ Π»ΠΈ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΈ направлСния символов 'L' ΠΈ 'R' Π² Π΄Π²ΡƒΡ… строках с ΡƒΡ‡Ρ‘Ρ‚ΠΎΠΌ ΠΈΡ… ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ Π½Π° Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅. ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΡŽ ΠΏΠΎ строкам ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, отслСТивая доступныС символы 'L' ΠΈ 'R' Ρ‡Π΅Ρ€Π΅Π· счётчики.

ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ πŸ› οΈ

  1. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ as_bytes(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ быстро ΠΏΠ΅Ρ€Π΅Π±Ρ€Π°Ρ‚ΡŒ символы Π² Π²ΠΈΠ΄Π΅ Π±Π°ΠΉΡ‚ΠΎΠ².
  2. ΠžΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΠΌ ΠΏΠΎ ΠΎΠ±Π΅ΠΈΠΌ строкам:
    • Если Π²ΠΈΠ΄ΠΈΠΌ 'L' Π² target, ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ счётчик доступных 'L'.
    • Если Π²ΠΈΠ΄ΠΈΠΌ 'L' Π² start, провСряСм, Π΅ΡΡ‚ΡŒ Π»ΠΈ доступный 'L', ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅ΠΌ счётчик.
    • Аналогично для 'R'
    • Π’Π°ΠΊΠΆΠ΅ провСряСм, Ρ‡Ρ‚ΠΎ 'R' Π½Π΅ пСрСсСкаСт 'L', ΠΈ Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎ Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ порядкС синхронизируСм счётчики.
  3. Π’ ΠΊΠΎΠ½Ρ†Π΅ провСряСм, Ρ‡Ρ‚ΠΎ всС 'L' ΠΈ 'R' ΡƒΡ‡Ρ‚Π΅Π½Ρ‹ (баланс счётчиков Π½ΡƒΠ»Π΅Π²ΠΎΠΉ).

Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ πŸ“Š

Π’Π°ΠΊΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ памяти, идСально подходя для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… строк.

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ

impl Solution {
    pub fn can_change(start: String, target: String) -> bool {
        let mut left_pieces = 0;  // Tracks available 'L' pieces
        let mut right_pieces = 0; // Tracks available 'R' pieces

        for (&start_char, &target_char) in 
                start.as_bytes().iter().zip(target.as_bytes().iter()
        ) {
            // Check for target_char == 'L'
            if target_char == b'L' {
                if right_pieces > 0 {
                    return false; // 'L' cannot cross 'R'
                }
                left_pieces += 1;
            }

            // Check for start_char == 'L'
            if start_char == b'L' {
                if left_pieces <= 0 {
                    return false; // No available 'L' to move
                }
                left_pieces -= 1;
            }

            // Check for start_char == 'R'
            if start_char == b'R' {
                if left_pieces > 0 {
                    return false; // 'R' cannot cross 'L'
                }
                right_pieces += 1;
            }

            // Check for target_char == 'R'
            if target_char == b'R' {
                if right_pieces <= 0 {
                    return false; // 'R' must have a matching piece
                }
                right_pieces -= 1;
            }
        }

        // All pieces should be accounted for
        left_pieces == 0 && right_pieces == 0
    }
}

ПолСзноС Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅