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

Π—Π°Π΄Π°Ρ‡Π° Π½Π° сСгодня 2381. Shifting Letters II - Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ нСслоТно, Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ идСя ΠΌΠ½Π΅ Π»ΠΈΡ‡Π½ΠΎ каТСтся интСрСсной ΠΈ симпатичной.

ОписаниС Π·Π°Π΄Π°Ρ‡ΠΈ πŸ”Ž

Π”Π°Π½Π° строка s ΠΈ список ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ shifts, Π³Π΄Π΅ каТдая опСрация Π·Π°Π΄Π°Ρ‘Ρ‚ Π½Π°Ρ‡Π°Π»ΠΎ ΠΈ ΠΊΠΎΠ½Π΅Ρ† Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ (Π²ΠΏΠ΅Ρ€Ρ‘Π΄ ΠΈΠ»ΠΈ Π½Π°Π·Π°Π΄).
Π’Π°ΡˆΠ° Π·Π°Π΄Π°Ρ‡Π° β€” ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ всС сдвиги ΠΊ строкС ΠΈ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

ИдСя πŸ”„

Для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΈ избСТания ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹Ρ… расчётов сдвигов, ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, основанный Π½Π° прСфиксных суммах. Π­Ρ‚ΠΎ позволяСт эффСктивно ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ кумулятивный эффСкт ΠΎΡ‚ всСх сдвигов Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ массивС ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈΡ… ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ Π·Π° ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΡ…ΠΎΠ΄.

Π”Π΅Ρ‚Π°Π»ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ πŸ“

  1. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ массив net_shifts, Π³Π΄Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ чистыС значСния сдвигов для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Π² строкС.
  2. ΠŸΡ€ΠΎΠΉΠ΄Π΅ΠΌΡΡ ΠΏΠΎ всСм опСрациям ΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΠΌ массив net_shifts, добавляя значСния Π² Π½Π°Ρ‡Π°Π»Π΅ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° ΠΈ вычитая ΠΈΡ… сразу послС Π΅Π³ΠΎ окончания.
  3. ΠŸΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ ΠΏΠΎ строкС, вычисляя кумулятивныС сдвиги ΠΈ примСняя ΠΈΡ… для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ символа.

Асимптотика ⏳

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ πŸ“

impl Solution {
    pub fn shifting_letters(s: String, shifts: Vec<Vec<i32>>) -> String {
        // Track the net shift values for each character in the string
        let mut net_shifts = vec![0; s.len()];
        for shift in shifts {
            let (start, end, direction) = (shift[0] as usize, shift[1] as usize, shift[2]);
            let shift_value = if direction == 1 { 1 } else { -1 };

            net_shifts[start] += shift_value;
            if end + 1 < s.len() {
                net_shifts[end + 1] -= shift_value;
            }
        }

        // Apply cumulative shifts and build the resulting string
        let mut cumulative_shift = 0;
        s.bytes()
            .enumerate()
            .map(|(i, byte)| {
                cumulative_shift = (cumulative_shift + net_shifts[i] + 26) % 26;
                let char_index = ((byte - b'a') as i32 + cumulative_shift) % 26;
                (b'a' + char_index as u8) as char
            })
            .collect()
    }
}