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

ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ Ρ‡Π΅Ρ€Π΅Π΄Ρƒ Π·Π°Π΄Π°Ρ‡ Π½Π° ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ - 1079. Letter Tile Possibilities.

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

Π£ нас Π΅ΡΡ‚ΡŒ Π½Π°Π±ΠΎΡ€ ΠΏΠ»ΠΈΡ‚ΠΎΠΊ, Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π½Π° ΠΎΠ΄Π½Π° Π±ΡƒΠΊΠ²Π°, прСдставлСнный Π² Π²ΠΈΠ΄Π΅ строки.
НСобходимо ΠΏΠΎΠ΄ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ количСство Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… нСпустых ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ Π±ΡƒΠΊΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠ»ΠΈΡ‚ΠΊΠΈ.

πŸ’‘ ИдСя Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ

πŸ§‘β€πŸ’» ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°

  1. Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΏΠ»ΠΈΡ‚ΠΎΠΊ:
    • ΠŸΠ»ΠΈΡ‚ΠΊΠΈ ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΏΠ»ΠΈΡ‚ΠΊΠΈ оказались рядом. Π­Ρ‚ΠΎ позволяСт Π½Π°ΠΌ эффСктивно Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π² сСгмСнты.
  2. Π“Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΏΠ»ΠΈΡ‚ΠΎΠΊ:
    • Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ массив сСгмСнтов, Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт прСдставляСт собой количСство ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… ΠΏΠ»ΠΈΡ‚ΠΎΠΊ.
    • НапримСр, для строки "AAB" сСгмСнты Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π²Π½Ρ‹ [2, 1] (2 ΠΏΠ»ΠΈΡ‚ΠΊΠΈ "A" ΠΈ 1 ΠΏΠ»ΠΈΡ‚ΠΊΠ° "B").
  3. БэктрСкинг β€” для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ сСгмСнта ΠΌΡ‹:
    • пытаСмся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ»ΠΈΡ‚ΠΊΡƒ (ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅ΠΌ количСство ΠΏΠ»ΠΈΡ‚ΠΎΠΊ Π² этом сСгмСнтС);
    • рСкурсивно исслСдуСм Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ;
    • ΠΈ Π·Π°Ρ‚Π΅ΠΌ восстанавливаСм состояниС сСгмСнта.
  4. ΠŸΠΎΠ΄ΡΡ‡Π΅Ρ‚ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ:
    • ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ добавляСм ΠΏΠ»ΠΈΡ‚ΠΊΡƒ Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, ΠΌΡ‹ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ счСтчик Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ.

⏱️ Асимптотика

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

use std::collections::HashSet;

impl Solution {
    pub fn num_tile_possibilities(tiles: String) -> i32 {
        let mut tiles: Vec<_> = tiles.chars().collect();
        tiles.sort_unstable(); // Sort tiles to group identical tiles together

        // Create segments that represent how many tiles of each character exist
        let mut segments: Vec<usize> = tiles
            .chunk_by(|a, b| a == b)
            .map(|c| c.len())
            .collect();

        // Start backtracking to count all possible valid sequences
        Self::backtrack(&mut segments)
    }

    // Backtracking function to count all valid sequences
    fn backtrack(segments: &mut [usize]) -> i32 {
        let mut count = 0; // Start with 0, as we're counting valid sequences only

        for i in 0..segments.len() {
            if segments[i] > 0 {
                // Reduce the count of the current character and recurse
                segments[i] -= 1;
                count += 1 + Self::backtrack(segments); // Add the current tile + recurse
                // Restore the count of the current character (backtrack)
                segments[i] += 1;
            }
        }

        count
    }
}

Tags: #rust #algorithms #backtracking