題目連結:
題目意譯:
給定一字串 s,回傳長度為 3 的相異迴文其為 s 的一個子序列之數量。
請注意即使有多種方式可以得到同一個子序列,其仍只會被納入計數一次。
一個迴文為正著讀與反著讀都相同的一個字串。
一個字串的一個子序列為一個新字串藉由刪除原始字串若干個(可能沒有)字元且不更動剩餘字元的相對順序而產生。
例如,"ace" 為 "abcde" 的一個子序列。
限制:
3 ≦ s.length ≦ 10 ^ 5
s 只由小寫英文字母組成。
範例測資:
範例 1:
輸入: s = "aabca"
輸出: 3
解釋: 3 個長度為 3 的迴文子序列為:
- "aba" ("aabca" 之子序列)
- "aaa" ("aabca" 之子序列)
- "aca" ("aabca" 之子序列)
範例 2:
輸入: s = "adc"
輸出: 0
解釋: "abc" 中沒有長度為 3 的迴文子序列。
範例 3:
輸入: s = "bbcbaba"
輸出: 4
解釋: 4 個長度為 3 的迴文子序列為:
- "bbb" ("bbcbaba" 之子序列)
- "bcb" ("bbcbaba" 之子序列)
- "bab" ("bbcbaba" 之子序列)
- "aba" ("bbcbaba" 之子序列)
解題思維:
窮舉所有可能的長度為 3 之迴文字串:
"aaa"、
"aba"、
……
"aza"、
"bab"、
……
然後判斷裡面有幾種是 s 的子序列,該數量即為所求。
而單一一次的判斷是不是子序列的時間複雜度需要從直觀的 O(s.length) 降低至 O(log(s.length)),作法可以參見
這題的心得後半提及的內容。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。