計算回文子序列數目 Unique Length 3 Palindromic Subseq_Leetcode#1930

更新 發佈閱讀 4 分鐘
raw-image

這題的題目在這裡:Unique Length-3 Palindromic Subsequences

題目敘述

題目會給我們一個字串s,內容都是由英文小寫字母組成,要求我們計算長度為3的回文子序列有多少個?

舉例,aba者種形式的序列,就是長度為3的回文序列。


測試範例

Example 1:

Input: s = "aabca"
Output: 3
Explanation: The 3 palindromic subsequences of length 3 are:
- "aba" (subsequence of "aabca")
- "aaa" (subsequence of "aabca")
- "aca" (subsequence of "aabca")

Example 2:

Input: s = "adc"
Output: 0
Explanation: There are no palindromic subsequences of length 3 in "adc".

Example 3:

Input: s = "bbcbaba"
Output: 4
Explanation: The 4 palindromic subsequences of length 3 are:
- "bbb" (subsequence of "bbcbaba")
- "bcb" (subsequence of "bbcbaba")
- "bab" (subsequence of "bbcbaba")
- "aba" (subsequence of "bbcbaba")

約束條件

Constraints:

  • 3 <= s.length <= 10^5
  • s consists of only lowercase English letters.

演算法

題目已經明確說字串s都是由英文小寫字母所組成。

此外,長度為三的回文子序列可寫成如下形式:

長度為三的回文子序列 = 邊界字元 + 中心字元 + 邊界字元

因此,我們可以先從邊界字元著手,找出對應左邊界和右邊界。

接著,再計算出中心自元有幾種可能(=夾在內部的子字串有幾個不同的字元)

最後,累加方法數的總和,就是長度為三的回文子序列的數目。


程式碼

class Solution:
 def countPalindromicSubsequence(self, s):
  
  # counting of length 3 palindrome
  counting = 0

  # Scan from a to z as boundary character
  for boundary in string.ascii_lowercase:
   
   # leftmost position of boundary character
   # rightmost position of boundary character
   left, right = s.find(boundary), s.rfind(boundary)

   if left != -1:

    # candidates of center character
    unique_chars = set( s[left+1:right])
    counting += len( unique_chars )

  return counting

複雜度分析

時間複雜度: O(26n) = O(n)

​外層迴圈,考慮每個英文字母最為邊界字元O(26)

內層陣列分割和集合建造,找出每個中心字元,耗費O(n)

空間複雜度: O(n)

陣列分割和集合建造都會付出O(n)的空間成本


關鍵知識點

長度為三的回文子序列 = 邊界字元 + 中心字元 + 邊界字元

因此,我們可以先從邊界字元著手,找出對應左邊界和右邊界。

接著,再計算出中心自元有幾種可能(=夾在內部的子字串有幾個不同的字元)

最後,累加方法數的總和,就是長度為三的回文子序列的數目。


Reference:

[1] Python O(26n) by boundary linear scan [w/ Comment] - Unique Length-3 Palindromic Subsequences - LeetCode

留言
avatar-img
留言分享你的想法!
avatar-img
小松鼠的演算法樂園
96會員
427內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
2024/10/06
題目敘述 Rank Transform of an Array 給定一個陣列arr,請根據數字的大小給予序號,序號值介於1~len( set(arr) )之間。 最大的數字給予最大的序號。 次大的數字給予次大的序號。 ...依此類推 最小的數字給予最小的序號1。
Thumbnail
2024/10/06
題目敘述 Rank Transform of an Array 給定一個陣列arr,請根據數字的大小給予序號,序號值介於1~len( set(arr) )之間。 最大的數字給予最大的序號。 次大的數字給予次大的序號。 ...依此類推 最小的數字給予最小的序號1。
Thumbnail
2024/10/01
題目敘述 Check If Array Pairs Are Divisible by k 給定一個長度為偶數的整數陣列arr,和一個整數k 。 我們想把陣列元素兩兩一組組成pair,使得每個pair的總和可以被k整除。 如果做得到,返回True。 如果不行,返回False。
Thumbnail
2024/10/01
題目敘述 Check If Array Pairs Are Divisible by k 給定一個長度為偶數的整數陣列arr,和一個整數k 。 我們想把陣列元素兩兩一組組成pair,使得每個pair的總和可以被k整除。 如果做得到,返回True。 如果不行,返回False。
Thumbnail
2024/09/29
My Calendar II 給定一個行事曆的class定義和行程安排的介面。 請完成下列function 1.建構子MyCalendarTwo() 2.boolean book(int start, int end) 在行事曆加入一項新行程,起始時間為start, 結束時間為end。
Thumbnail
2024/09/29
My Calendar II 給定一個行事曆的class定義和行程安排的介面。 請完成下列function 1.建構子MyCalendarTwo() 2.boolean book(int start, int end) 在行事曆加入一項新行程,起始時間為start, 結束時間為end。
Thumbnail
看更多
你可能也想看
Thumbnail
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
Thumbnail
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
Thumbnail
題目敘述 Longest Palindromic Subsequence 給定一個字串s,請找出字串s的最長回文子序列的長度。 註: 子序列 不要求一定要連續。 測試範例 Input: s = "bbbab" Output: 4
Thumbnail
題目敘述 Longest Palindromic Subsequence 給定一個字串s,請找出字串s的最長回文子序列的長度。 註: 子序列 不要求一定要連續。 測試範例 Input: s = "bbbab" Output: 4
Thumbnail
題目敘述 Longest Palindromic Substring 給定一個輸入字串s,請找出最長的回文子字串。 答案可能不只一個,回傳任何一個合法的答案皆可。
Thumbnail
題目敘述 Longest Palindromic Substring 給定一個輸入字串s,請找出最長的回文子字串。 答案可能不只一個,回傳任何一個合法的答案皆可。
Thumbnail
題目敘述 題目會給定一個字串s,和指定長度k,問我們包含母音的子字串中,母音數量的最大值是多少? 題目的原文敘述 測試範例 Example 1: Input: s = "abciiidef", k = 3 Output: 3 Explanation: The substring "iii
Thumbnail
題目敘述 題目會給定一個字串s,和指定長度k,問我們包含母音的子字串中,母音數量的最大值是多少? 題目的原文敘述 測試範例 Example 1: Input: s = "abciiidef", k = 3 Output: 3 Explanation: The substring "iii
Thumbnail
題目敘述 題目會給我們一個輸入陣列nums,要求我們判斷輸入陣列nums內部是否存在長度為三的遞增子序列? 題目的原文敘述 測試範例 Example 1: Input: nums = [1,2,3,4,5] Output: true Explanation: Any triplet wh
Thumbnail
題目敘述 題目會給我們一個輸入陣列nums,要求我們判斷輸入陣列nums內部是否存在長度為三的遞增子序列? 題目的原文敘述 測試範例 Example 1: Input: nums = [1,2,3,4,5] Output: true Explanation: Any triplet wh
Thumbnail
題目敘述 題目會給我們一個輸入陣列nums,和一個指定的k值。 請問,在輸入陣列nums中,有幾個子陣列的元素總合恰好為k ? 例如: nums = [1,2,3], k = 3 則有兩個子陣列的元素總合為3,分別是[1,2] 和 [3] 如果是第一次聽到或接觸前綴和prefix的同學
Thumbnail
題目敘述 題目會給我們一個輸入陣列nums,和一個指定的k值。 請問,在輸入陣列nums中,有幾個子陣列的元素總合恰好為k ? 例如: nums = [1,2,3], k = 3 則有兩個子陣列的元素總合為3,分別是[1,2] 和 [3] 如果是第一次聽到或接觸前綴和prefix的同學
Thumbnail
題目會給我們一個字串s,內容都是由英文小寫字母組成,要求我們計算長度為3的回文子序列有多少個? 舉例,aba者種形式的序列,就是長度為3的回文序列。
Thumbnail
題目會給我們一個字串s,內容都是由英文小寫字母組成,要求我們計算長度為3的回文子序列有多少個? 舉例,aba者種形式的序列,就是長度為3的回文序列。
Thumbnail
題目會給定我們一個字串s,要求我們計算出同質子字串有幾個? 同質子字串的定義就是子字串內部的字元都相同,例如a, aa, aaa, ... 等等這些就是同質子字串。
Thumbnail
題目會給定我們一個字串s,要求我們計算出同質子字串有幾個? 同質子字串的定義就是子字串內部的字元都相同,例如a, aa, aaa, ... 等等這些就是同質子字串。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News