題目描述:
給定字串 s,求其中長度為 3 的回文子序列有多少種不同的。長度為 3 的回文形式為 aba,即首尾字元相同、中間字元任意。
解題思路:
對於每種字元 a(26 種小寫字母),找到它在字串中第一次出現和最後一次出現的位置。
a 在 first 和 last 之間出現了至少兩次(first < last),則所有出現在 (first, last) 開區間內的不同字元都可以作為中間字元 b,構成回文 aba。(first, last) 之間有多少種不同字元即可。遍歷 26 個字母,每個字母找首尾位置後用 HashSet 統計中間字元種類。
時間複雜度:O(26 × n) = O(n) — 對 26 個字母各掃描字串一次找首尾,再掃描一次統計中間字元。
空間複雜度:O(26) = O(1) — HashSet 最多存 26 個字元。
1. Initialize result = 0 2. For each character c from 'a' to 'z': a. Find first and last occurrence of c in s b. If c appears fewer than 2 times, skip c. Count distinct characters in s[first+1 .. last-1] d. result += distinct count 3. Return result
前綴集合/位元遮罩 O(n):預計算前綴和後綴的字元集合(用 26 位 bitmask)。對每個位置 i,左邊出現的字元集合 ∩ 右邊出現的字元集合 就是能以 s[i] 為中心構成回文的首尾字元。用 popcount 計數。避免重複掃描,但邏輯較複雜。
暴力枚舉 O(n³):三重迴圈枚舉所有長度 3 的子序列,檢查是否回文,用 HashSet 去重。n 大時不可行。