Π‘ΡΡΠ»ΠΊΠ° Π½Π° Π·Π°Π΄Π°ΡΡ β 1415. The k-th Lexicographical String of All Happy Strings of Length n.
π ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ
"Π‘ΡΠ°ΡΡΠ»ΠΈΠ²Π°Ρ ΡΡΡΠΎΠΊΠ°" β ΡΡΠΎ ΡΡΡΠΎΠΊΠ° Π΄Π»ΠΈΠ½Ρ n
, ΡΠΎΡΡΠΎΡΡΠ°Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠ· ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² ['a'
, 'b'
, 'c'
], Π² ΠΊΠΎΡΠΎΡΠΎΠΉ Π½Π΅Ρ Π΄Π²ΡΡ
ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΡ
ΠΏΠΎΠ΄ΡΡΠ΄ ΠΈΠ΄ΡΡΠΈΡ
ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ².
ΠΡΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ k
-Ρ ΡΡΠ°ΡΡΠ»ΠΈΠ²ΡΡ ΡΡΡΠΎΠΊΡ Π² Π»Π΅ΠΊΡΠΈΠΊΠΎΠ³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅, Π»ΠΈΠ±ΠΎ Π²Π΅ΡΠ½ΡΡΡ ""
, Π΅ΡΠ»ΠΈ ΡΠ°ΠΊΠΈΡ
ΡΡΡΠΎΠΊ ΠΌΠ΅Π½ΡΡΠ΅ k
.
π‘ ΠΠ΄Π΅Ρ
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ²ΡΠ·Ρ ΡΡΠ°ΡΡΠ»ΠΈΠ²ΡΡ
ΡΡΡΠΎΠΊ Ρ Π΄Π²ΠΎΠΈΡΠ½ΡΠΌΠΈ ΡΡΡΠΎΠΊΠ°ΠΌΠΈ.
ΠΠ°ΠΆΠ΄Π°Ρ ΡΡΠ°ΡΡΠ»ΠΈΠ²Π°Ρ ΡΡΡΠΎΠΊΠ°:
- ΠΠ°ΡΠΈΠ½Π°Π΅ΡΡΡ Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΡΡΡΡ
ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² (
'a'
, 'b'
, 'c'
) β 3 Π²Π°ΡΠΈΠ°Π½ΡΠ°.
- ΠΡΡΠ°Π»ΡΠ½ΡΠ΅
(n-1)
ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² ΡΠΎΡΠΌΠΈΡΡΡΡΡΡ ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ Ρ Π΄Π²ΠΎΠΈΡΠ½ΠΎΠΉ ΡΡΡΠΎΠΊΠΎΠΉ, Π³Π΄Π΅ Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π° Π΅ΡΡΡ ΡΠΎΠ²Π½ΠΎ Π΄Π²Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ
Π²Π°ΡΠΈΠ°Π½ΡΠ° β Γ2 Π½Π° ΠΊΠ°ΠΆΠ΄ΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΡ.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π΄Π²ΠΎΠΈΡΠ½ΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ k-1
ΠΏΠΎΡΡΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΡΡΡΡΠΊΡΡΡΡ ΡΡΠ΅Π±ΡΠ΅ΠΌΠΎΠΉ ΡΡΡΠΎΠΊΠΈ (Π±Π΅Π· ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π°).
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π±ΠΈΡΡ 0
ΠΈ 1
ΠΈΠ· ΡΡΠΎΠ³ΠΎ Π΄Π²ΠΎΠΈΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ, ΡΡΠΎΠ±Ρ Π²ΡΠ±ΠΈΡΠ°ΡΡ ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π²ΡΠΌΡ Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΠΌΠΈ ΡΠΈΠΌΠ²ΠΎΠ»Π°ΠΌΠΈ ΠΏΡΠΈ ΠΈΡΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΎΠΉ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΉ ΡΡΠ°ΡΡΠ»ΠΈΠ²ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ. π
π ΠΠ΅ΡΠ°Π»ΠΈ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄Π°
-
ΠΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ
ΡΡΡΠΎΠΊ Ρ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ ΠΏΠ΅ΡΠ²ΡΠΌ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ:
happy_count = 2nβ1
- ΠΡΠΎ ΡΠΈΡΠ»ΠΎ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΡΠΎΠΊ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ Ρ 'a', 'b' ΠΈΠ»ΠΈ 'c'.
-
ΠΡΠ±ΠΈΡΠ°Π΅ΠΌ ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠΈΠΌΠ²ΠΎΠ» ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ
(k-1) / happy_count
:
(k-1) / happy_count = 0
β 'a'
(k-1) / happy_count = 1
β 'b'
(k-1) / happy_count = 2
β 'c'
-
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π±ΠΈΡΡ ΠΈΠ· Π΄Π²ΠΎΠΈΡΠ½ΠΎΠΉ ΡΠΎΡΠΌΡ
k-1
Π΄Π»Ρ Π²ΡΠ±ΠΎΡΠ° ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΡ
ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ²:
ΠΠ°ΠΆΠ΄ΡΠΉ Π±ΠΈΡ (0
ΠΈΠ»ΠΈ 1
) ΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π²ΡΠ±ΠΎΡΠΎΠΌ ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π²ΡΠΌΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΌΠΈ ΡΠΈΠΌΠ²ΠΎΠ»Π°ΠΌΠΈ, ΠΈΡΠΊΠ»ΡΡΠ°Ρ ΠΏΠΎΠ²ΡΠΎΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ.
- ΠΡΠ»ΠΈ
Π±ΠΈΡ = 0
, Π²ΡΠ±ΠΈΡΠ°Π΅ΠΌ ΠΌΠ΅Π½ΡΡΠΈΠΉ Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΠΉ ΡΠΈΠΌΠ²ΠΎΠ».
- ΠΡΠ»ΠΈ
Π±ΠΈΡ = 1
, Π²ΡΠ±ΠΈΡΠ°Π΅ΠΌ Π±ΠΎΠ»ΡΡΠΈΠΉ Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΠΉ ΡΠΈΠΌΠ²ΠΎΠ».
-
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ ΠΈΡΠΎΠ³ΠΎΠ²ΡΡ ΡΡΡΠΎΠΊΡ. π
π ΠΡΠΈΠΌΠΏΡΠΎΡΠΈΠΊΠ°
- ΠΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ:
O(n)
, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΏΡΠΎΡ
ΠΎΠ΄ΠΈΠΌ ΡΡΡΠΎΠΊΡ ΡΠΎΠ²Π½ΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·.
- ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΏΠ°ΠΌΡΡΡ:
O(n)
, Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ ΡΡΡΠΎΠΊΠΈ-ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°.
π» ΠΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄
impl Solution {
pub fn get_happy_string(n: i32, k: i32) -> String {
let mut result = String::with_capacity(n as usize);
let mut k = k - 1; // Convert to zero-based index
let happy_count = 1 << (n - 1); // Number of happy strings with a fixed first character
// Determine the first character
let first_char = match k / happy_count {
0 => 'a',
1 => 'b',
2 => 'c',
_ => return "".to_string(), // Not enough happy strings exist
};
result.push(first_char);
k %= happy_count; // Update k to determine the remaining characters
// Construct the happy string
for i in (0..n - 1).rev() {
let prev_char = result.chars().last().unwrap();
let happy_count = 1 << i; // Number of happy strings with a fixed prefix of length n-i
let mut next_char = Self::adjust_char('a', prev_char);
if k >= happy_count {
next_char = Self::adjust_char(((next_char as u8) + 1) as char, prev_char);
k -= happy_count;
}
result.push(next_char);
}
result
}
// Ensure that the selected character is different from the previous one
fn adjust_char(candidate: char, prev_char: char) -> char {
if candidate == prev_char {
return ((candidate as u8) + 1) as char; // Move to the next valid character
}
candidate
}
}
Tags: #rust #algorithms #strings