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

Бсылка Π½Π° Π·Π°Π΄Π°Ρ‡Ρƒ – 1790. Check if One String Swap Can Make Strings Equal.

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

Π”Π°Π½Ρ‹ Π΄Π²Π΅ строки s1 ΠΈ s2 Ρ€Π°Π²Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹. НСобходимо ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ строки Ρ€Π°Π²Π½Ρ‹ΠΌΠΈ, ΡΠΎΠ²Π΅Ρ€ΡˆΠΈΠ² Π½Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΠΌΠ΅Π½Π° символов Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· строк.
ОбмСн β€” это опСрация, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹Π±ΠΈΡ€Π°ΡŽΡ‚ΡΡ Π΄Π²Π° индСкса Π² строкС ΠΈ символы Π½Π° этих позициях ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ мСстами.

ИдСя 😊

Основная идСя Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² поискС ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… символы Π² строках Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ.

Π”Π΅Ρ‚Π°Π»ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° πŸš€

  1. Π‘Π±ΠΎΡ€ Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‰ΠΈΡ…ΡΡ индСксов:
    • ΠŸΡ€ΠΎΠΉΠ΄Π΅ΠΌΡΡ ΠΏΠΎ всСм индСксам строк ΠΈ собСрСм Π² Π²Π΅ΠΊΡ‚ΠΎΡ€ Ρ‚Π΅ индСксы, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… символы Π² s1 ΠΈ s2 Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ.
      ΠŸΡ€ΠΈ этом достаточно ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ максимум 3 индСкса.
  2. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° случаСв:
    • НСт Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠΉ: Если Π²Π΅ΠΊΡ‚ΠΎΡ€ пуст, строки Ρ€Π°Π²Π½Ρ‹.
    • Π”Π²Π° различия: Если Π² Π²Π΅ΠΊΡ‚ΠΎΡ€Π΅ Ρ€ΠΎΠ²Π½ΠΎ Π΄Π²Π° индСкса, провСряСм: соотвСтствуСт Π»ΠΈ ΠΎΠ±ΠΌΠ΅Π½ символами Π² этих позициях ΡƒΡΠ»ΠΎΠ²ΠΈΡŽ
      (s1[i] == s2[j] ΠΈ s1[j] == s2[i])
    • Π›ΡŽΠ±ΠΎΠΉ Π΄Ρ€ΡƒΠ³ΠΎΠΉ случай ❌: Если индСкс ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ ΠΈΡ… большС Π΄Π²ΡƒΡ…, ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΠΌΠ΅Π½ Π½Π΅ смоТСт Π²Ρ‹Ρ€ΠΎΠ²Π½ΡΡ‚ΡŒ строки.

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

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ πŸ’»

impl Solution {
    pub fn are_almost_equal(s1: String, s2: String) -> bool {
        let n = s1.len();
        let s1_bytes = s1.as_bytes();
        let s2_bytes = s2.as_bytes();

        // Collect up to 3 indices where characters differ.
        let mismatch_indices: Vec<_> = (0..n)
            .filter(|&i| s1_bytes[i] != s2_bytes[i])
            .take(3)
            .collect();

        match mismatch_indices[..] {
            [] => true, // No mismatches: strings are equal.
            [i, j] => s1_bytes[i] == s2_bytes[j] && s1_bytes[j] == s2_bytes[i],
            _ => false, // 1 mismatch or >2 mismatches: cannot be fixed by one swap.
        }
    }
}

Tags: #rust #algorithms #strings