ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ ΡΠ΅ΡΠ΅Π΄Ρ Π·Π°Π΄Π°Ρ Π½Π° ΠΏΠ΅ΡΠ΅Π±ΠΎΡ - 1079. Letter Tile Possibilities.
π ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ
Π£ Π½Π°Ρ Π΅ΡΡΡ Π½Π°Π±ΠΎΡ ΠΏΠ»ΠΈΡΠΎΠΊ, Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ
Π½Π°ΠΏΠ΅ΡΠ°ΡΠ°Π½Π° ΠΎΠ΄Π½Π° Π±ΡΠΊΠ²Π°, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π½ΡΠΉ Π² Π²ΠΈΠ΄Π΅ ΡΡΡΠΎΠΊΠΈ.
ΠΠ΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ΄ΡΡΠΈΡΠ°ΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ
Π½Π΅ΠΏΡΡΡΡΡ
ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠ΅ΠΉ Π±ΡΠΊΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡΡΠ°Π²ΠΈΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΏΠ»ΠΈΡΠΊΠΈ.
π‘ ΠΠ΄Π΅Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ
- ΠΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π±ΡΠΊΡΡΠ΅ΠΊΠΈΠ½Π³.
- Π§ΡΠΎΠ±Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π½Π° ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΡΡΡ ΡΠ΅ΡΠ΅Π·
HashSet
, ΡΠ½Π°ΡΠ°Π»Π° ΡΠΎΡΡΠΈΡΡΠ΅ΠΌ ΠΏΠ»ΠΈΡΠΊΠΈ, Π° Π·Π°ΡΠ΅ΠΌ Π³ΡΡΠΏΠΏΠΈΡΡΠ΅ΠΌ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠ΅ ΠΏΠ»ΠΈΡΠΊΠΈ Π² ΡΠ΅Π³ΠΌΠ΅Π½ΡΡ.
- ΠΠ°Π»Π΅Π΅, Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ΅ΠΊΡΡΡΠΈΠΈ, ΠΏΠ΅ΡΠ΅Π±ΠΈΡΠ°Π΅ΠΌ Π²ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, Π³Π°ΡΠ°Π½ΡΠΈΡΡΡ, ΡΡΠΎ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠ΅ ΠΏΠ»ΠΈΡΠΊΠΈ Π½Π΅ Π±ΡΠ΄ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°Π·Π° Π² ΠΎΠ΄Π½ΠΎΠΌ Π½Π°Π±ΠΎΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠ΅ΠΉ.
π§βπ» ΠΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄Π°
- Π‘ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΠΏΠ»ΠΈΡΠΎΠΊ:
- ΠΠ»ΠΈΡΠΊΠΈ ΡΠΎΡΡΠΈΡΡΡΡΡΡ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠ΅ ΠΏΠ»ΠΈΡΠΊΠΈ ΠΎΠΊΠ°Π·Π°Π»ΠΈΡΡ ΡΡΠ΄ΠΎΠΌ. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΌ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ Π³ΡΡΠΏΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΈΡ
Π² ΡΠ΅Π³ΠΌΠ΅Π½ΡΡ.
- ΠΡΡΠΏΠΏΠΈΡΠΎΠ²ΠΊΠ° ΠΏΠ»ΠΈΡΠΎΠΊ:
- Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΌΠ°ΡΡΠΈΠ² ΡΠ΅Π³ΠΌΠ΅Π½ΡΠΎΠ², Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΡ
ΠΏΠ»ΠΈΡΠΎΠΊ.
- ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π»Ρ ΡΡΡΠΎΠΊΠΈ
"AAB"
ΡΠ΅Π³ΠΌΠ΅Π½ΡΡ Π±ΡΠ΄ΡΡ ΡΠ°Π²Π½Ρ [2, 1]
(2 ΠΏΠ»ΠΈΡΠΊΠΈ "A" ΠΈ 1 ΠΏΠ»ΠΈΡΠΊΠ° "B").
- ΠΡΠΊΡΡΠ΅ΠΊΠΈΠ½Π³ β Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ° ΠΌΡ:
- ΠΏΡΡΠ°Π΅ΠΌΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΠ»ΠΈΡΠΊΡ (ΡΠΌΠ΅Π½ΡΡΠ°Π΅ΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠ»ΠΈΡΠΎΠΊ Π² ΡΡΠΎΠΌ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ΅);
- ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎ ΠΈΡΡΠ»Π΅Π΄ΡΠ΅ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ;
- ΠΈ Π·Π°ΡΠ΅ΠΌ Π²ΠΎΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°.
- ΠΠΎΠ΄ΡΡΠ΅Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠ΅ΠΉ:
- ΠΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° ΠΌΡ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΠΏΠ»ΠΈΡΠΊΡ Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ, ΠΌΡ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΠΌ ΡΡΠ΅ΡΡΠΈΠΊ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ
ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠ΅ΠΉ.
β±οΈ ΠΡΠΈΠΌΠΏΡΠΎΡΠΈΠΊΠ°
- ΠΡΠ΅ΠΌΡ:
O(n!)
, Π³Π΄Π΅ n
β Π΄Π»ΠΈΠ½Π° ΡΡΡΠΎΠΊΠΈ.
- Π‘ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΠΏΠ»ΠΈΡΠΎΠΊ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ
O(n log n)
- ΠΡΠΊΡΡΠ΅ΠΊΠΈΠ½Π³ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ Π²ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΏΠ»ΠΈΡΠΎΠΊ (Π΄ΠΎ
O(n!)
).
- ΠΠ°ΠΌΡΡΡ:
O(n)
Π΄Π»Ρ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠΎΠ² ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΡ
ΠΏΠ»ΠΈΡΠΎΠΊ ΠΈ ΡΡΠ΅ΠΊΠ° Π² ΠΏΠ΅ΡΠ΅Π±ΠΎΡΠ΅.
π ΠΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄
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