ΠΠ°ΡΠ° ΠΎΡΠ΅ΡΠ΅Π΄Π½Π°Ρ Π·Π°Π΄Π°ΡΠ° - 1930. Unique Length-3 Palindromic Subsequences.
π ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ
ΠΠ°Π½Π° ΡΡΡΠΎΠΊΠ° s
. ΠΠ΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΡ
ΠΏΠ°Π»ΠΈΠ½Π΄ΡΠΎΠΌΠΎΠ² Π΄Π»ΠΈΠ½Ρ 3, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ²Π»ΡΡΡΡΡ ΠΏΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡΠΌΠΈ ΡΡΡΠΎΠΊΠΈ.
ΠΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ β ΡΡΠΎ ΡΡΡΠΎΠΊΠ°, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½Π°Ρ ΠΈΠ· ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ΠΌ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ
(Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½ΡΠ»Ρ) ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΈΡ
ΠΏΠΎΡΡΠ΄ΠΊΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π»Ρ ΡΡΡΠΎΠΊΠΈ "abcde"
ΡΡΡΠΎΠΊΠ° "ace"
ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡΡ.
ΠΠ°Π»ΠΈΠ½Π΄ΡΠΎΠΌ β ΡΡΠΎ ΡΡΡΠΎΠΊΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΈΡΠ°Π΅ΡΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ Π² ΠΏΡΡΠΌΠΎΠΌ ΠΈ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΌ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡΡ
.
π‘ ΠΠ΄Π΅Ρ
ΠΡΠ½ΠΎΠ²Π½Π°Ρ ΠΈΠ΄Π΅Ρ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΏΠ°Π»ΠΈΠ½Π΄ΡΠΎΠΌ Π΄Π»ΠΈΠ½Ρ 3 ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΠΏΠ΅ΡΠ²ΡΠΌΠΈ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΌΠΈ ΡΠΈΠΌΠ²ΠΎΠ»Π°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡ, Π° ΡΠ°ΠΊΠΆΠ΅ Π»ΡΠ±ΡΠΌ Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΠΌ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ ΠΏΠΎΡΠ΅ΡΠ΅Π΄ΠΈΠ½Π΅.
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ ΡΠ°ΠΊΠΈΠ΅ ΠΏΠ°ΡΡ (ΠΏΠ΅ΡΠ²ΡΠΉ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΡΠΈΠΌΠ²ΠΎΠ»Ρ) Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π±ΠΈΡΠΎΠ²ΠΎΠ³ΠΎ ΠΌΠ°ΡΡΠΈΠ²Π° (bitset), ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ.
π ΠΠ΅ΡΠ°Π»ΠΈ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄Π°
-
ΠΠ°ΡΡΠΈΠ²Ρ ΡΠ°ΡΡΠΎΡ:
prefix_frequency
: Ρ
ΡΠ°Π½ΠΈΡ ΡΠ°ΡΡΠΎΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² ΡΠ»Π΅Π²Π° ΠΎΡ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ.
suffix_frequency
: Ρ
ΡΠ°Π½ΠΈΡ ΡΠ°ΡΡΠΎΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² ΡΠΏΡΠ°Π²Π° ΠΎΡ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ.
-
ΠΠΈΡΠΎΠ²ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² Π΄Π»Ρ Π²ΡΡΡΠ΅ΡΠ΅Π½Π½ΡΡ
ΠΏΠ°Π»ΠΈΠ½Π΄ΡΠΎΠΌΠΎΠ²:
- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΌΠ°ΡΡΠΈΠ²
u32
, Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ, ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌΠΎΠ΅ ΠΊΠ°ΠΊ Π±ΠΈΡΠΎΠ²ΠΎΠ΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ, ΠΊΠΎΠ΄ΠΈΡΡΠ΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΠΏΠ°Π»ΠΈΠ½Π΄ΡΠΎΠΌΡ (ΠΏΠΎ ΡΡΡΠΈ, ΠΊΡΠ°ΠΉΠ½ΠΈΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Ρ) Π΄Π»Ρ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π° ΠΏΠΎΡΠ΅ΡΠ΅Π΄ΠΈΠ½Π΅.
-
ΠΠ±Ρ
ΠΎΠ΄ ΡΡΡΠΎΠΊΠΈ: ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π°:
- ΠΠ±Π½ΠΎΠ²Π»ΡΠ΅ΠΌ ΠΌΠ°ΡΡΠΈΠ²Ρ ΡΠ°ΡΡΠΎΡ.
- ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ Π²ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΠΊΡΠ°ΠΉΠ½ΠΈΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Ρ (ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ
prefix_frequency
ΠΈ suffix_frequency
) ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΠΌ Π±ΠΈΡΠΎΠ²ΡΠΉ ΠΌΠ°ΡΡΠΈΠ², Π΅ΡΠ»ΠΈ ΡΠΈΠΌΠ²ΠΎΠ» Π΄ΠΎΠΏΡΡΡΠΈΠΌ.
-
ΠΠΎΠ΄ΡΡΡΡ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΡ
ΠΏΠ°Π»ΠΈΠ½Π΄ΡΠΎΠΌΠΎΠ²:
- Π‘ΡΠΌΠΌΠΈΡΡΠ΅ΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΡ
Π±ΠΈΡΠΎΠ² Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ Π±ΠΈΡΠΎΠ²ΡΡ
ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ², ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΎΠ±ΡΠ΅Π΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΡ
ΠΏΠ°Π»ΠΈΠ½Π΄ΡΠΎΠΌΠΎΠ².
β± ΠΡΠΈΠΌΠΏΡΠΎΡΠΈΠΊΠ°
-
ΠΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ:
O(n)
- ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π° ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ
26
Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ
ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² Π΄Π»Ρ ΠΏΠ°ΡΡ (ΠΏΠ΅ΡΠ²ΡΠΉ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ).
-
ΠΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅Π½Π½Π°Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ:
O(1)
- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΌΠ°ΡΡΠΈΠ²Ρ Π΄Π»Ρ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠ°ΡΡΠΎΡ ΠΈ Π±ΠΈΡΠΎΠ²ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ
26
.
π» ΠΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄
impl Solution {
pub fn count_palindromic_subsequence(s: String) -> i32 {
const ALPHABET_SIZE: usize = 26;
// Step 1: Suffix frequency tracking
let mut suffix_frequency = vec![0; ALPHABET_SIZE];
for &c in s.as_bytes() {
suffix_frequency[(c - b'a') as usize] += 1;
}
let mut prefix_frequency = vec![0; ALPHABET_SIZE];
let mut seen_palindromes = vec![0u32; ALPHABET_SIZE]; // Bitset for each character pair
// Step 2: Traverse characters
for &c in s.as_bytes() {
let index = (c - b'a') as usize;
suffix_frequency[index] -= 1;
let mut val = seen_palindromes[index];
for i in 0..ALPHABET_SIZE {
let mask = 1 << i;
// Check if the bit is unset and the pair forms a valid palindrome
if (val & mask) == 0 && prefix_frequency[i] > 0 && suffix_frequency[i] > 0 {
val |= mask; // Set the bit for the pair (index, i)
}
}
seen_palindromes[index] = val;
prefix_frequency[index] += 1;
}
// Step 3: Count unique palindromes
seen_palindromes.iter().map(|&bits| bits.count_ones() as i32).sum()
}
}