有幾個同質子字串? Count Num of Homogenous Substrings Leetcode #1759

閱讀時間約 4 分鐘
raw-image

這題的題目在這裡:Count Number of Homogenous Substrings

題目敘述

題目會給定我們一個字串s,要求我們計算出同質子字串有幾個?

同質子字串的定義就是子字串內部的字元都相同,例如a, aa, aaa, ... 等等這些就是同質子字串。

最後,題目要求回傳答案前,必須對10^9+7做除法,取餘數當作最終答案。


測試範例

Example 1:

Input: s = "abbcccaa"
Output: 13
Explanation: The homogenous substrings are listed as below:
"a" appears 3 times.
"aa" appears 1 time.
"b" appears 2 times.
"bb" appears 1 time.
"c" appears 3 times.
"cc" appears 2 times.
"ccc" appears 1 time.
3 + 1 + 2 + 1 + 3 + 2 + 1 = 13.

Example 2:

Input: s = "xy"
Output: 2
Explanation: The homogenous substrings are "x" and "y".

Example 3:

Input: s = "zzzzz"
Output: 15

約束條件

Constraints:

  • 1 <= s.length <= 10^5
  • s consists of lowercase letters.

演算法

其實由左到右的線性掃描就可以滿足需求

每次迭代,觀察以s[i]為結尾的同質子字串有幾個。


以範例"abbcccaa"為例子

a 貢獻一組a

b 貢獻一組b

下一個 b 貢獻兩組b, bb

c 貢獻一組c

下一個 c 貢獻兩組c, cc

再下一個c 貢獻三組c, cc, ccc

a 貢獻一組a

下一個 a 貢獻兩組a, aa

總共有 1 + 1 + 2 + 1 + 2 + 3 + 1 + 2 = 13 組同質子字串。


每次迭代檢查當下這個字元有沒有和前一個字元重複

如果有重複,把重複長度+1

如果沒有重複,把重複長度reset 成1,代表這回合遇到的是新的字元。

每次迭代,把當前貢獻的同質子字串數目累加到result。


最後,result 對 10^9 + 7 做除法 取餘數,回傳最終答案即可。


程式碼

class Solution:
 def countHomogenous(self, s: str) -> int:

  result, count = 0, 0

  for i, char in enumerate(s):
   if i == 0 or s[i-1] == char:
    # update homogenous substring count, ending at s[i]
    count += 1
   else:
    # we meet a new character, different to previous one
    count = 1
   
   # accumulate total count of homogenous substring
   result += count

  return result % (10**9 + 7)

複雜度分析

時間複雜度:

O(n) 使用一次線性掃描,長度和原本的輸入字串一樣長O(n)。

空間複雜度:

O(1) 使用到的都是固定尺寸的臨時變數,為常數級別。


關鍵知識點

每次迭代,觀察以s[i]為結尾的同質子字串有幾個。


Reference:

[1] Count Number of Homogenous Substrings - LeetCode

86會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
題目會給定我們兩個點座標,分別是起點和終點。 另外,還有一個參數t,代表時間限制。 從起點出發之後,每一秒鐘,我們必須選擇一個N8 8連通的方向,往鄰居的格子點移動。(題目有特別強調,每一秒必須強制移動到下一個格子點,不能停留在原地) 請問我們能不能在時間限制內,從起點走到終點?
題目會給我們一個陣列prices,裡面的數值代表每一個交易日的股票股價。 題目給我們一次做多的機會,也就是A交易日買進,B交易日賣出,請問最大獲利是多少?(此處不需要考慮現實面的交易稅、手續費...等因素) 如果無法獲利,則題目要求return 0。
場景是防禦城市,免於怪獸的入侵 題目會給定兩個陣列 一個是dist,代表怪獸和城市之間的距離 一個是speed,代表怪獸每分鐘前進的距離,也就是怪獸的速度 有一把一開始已經充滿電的電動槍,一槍可以擊殺一隻怪獸,擊發後需要耗費一分鐘的冷卻時間讓電動槍再次充滿電。 題目要求我們計算最多可以消滅幾隻怪獸?
題目會定義一組類別和介面,要求我們實做餐廳訂位報號系統。 SeatManager(int n) : 初始化餐廳最多有n個座位,n 最少是1 int reserve() : 要求返回最小的可讓客人入座的空座位編號。 void unreserve(int seatNumber) : 取消訂位,這個座位歸
題目會給們一個陣列,還有一個k值。 好陣列定義是: 有包含nums[k]的子陣列。 分數定義是: min(nums[i], nums[i+1], ..., nums[j]) * (j - i + 1) 其中, i, j 分別是子陣列的左端點和右端點 請問,好的子陣列的最大分數是多少?
題目會給們一個陣列,還有一個k值。 接著進行比大小的遊戲,規則如下: 每次取陣列前兩個元素值比大小,比較小的會被重新安排到陣列最後方,陣列前兩個元素值比大小,同樣的,比較小的會被重新安排到陣列最後方。依此類推,反覆進行比大小的遊戲。 請問第一個能連贏k回合的是哪個數字?
題目會給定我們兩個點座標,分別是起點和終點。 另外,還有一個參數t,代表時間限制。 從起點出發之後,每一秒鐘,我們必須選擇一個N8 8連通的方向,往鄰居的格子點移動。(題目有特別強調,每一秒必須強制移動到下一個格子點,不能停留在原地) 請問我們能不能在時間限制內,從起點走到終點?
題目會給我們一個陣列prices,裡面的數值代表每一個交易日的股票股價。 題目給我們一次做多的機會,也就是A交易日買進,B交易日賣出,請問最大獲利是多少?(此處不需要考慮現實面的交易稅、手續費...等因素) 如果無法獲利,則題目要求return 0。
場景是防禦城市,免於怪獸的入侵 題目會給定兩個陣列 一個是dist,代表怪獸和城市之間的距離 一個是speed,代表怪獸每分鐘前進的距離,也就是怪獸的速度 有一把一開始已經充滿電的電動槍,一槍可以擊殺一隻怪獸,擊發後需要耗費一分鐘的冷卻時間讓電動槍再次充滿電。 題目要求我們計算最多可以消滅幾隻怪獸?
題目會定義一組類別和介面,要求我們實做餐廳訂位報號系統。 SeatManager(int n) : 初始化餐廳最多有n個座位,n 最少是1 int reserve() : 要求返回最小的可讓客人入座的空座位編號。 void unreserve(int seatNumber) : 取消訂位,這個座位歸
題目會給們一個陣列,還有一個k值。 好陣列定義是: 有包含nums[k]的子陣列。 分數定義是: min(nums[i], nums[i+1], ..., nums[j]) * (j - i + 1) 其中, i, j 分別是子陣列的左端點和右端點 請問,好的子陣列的最大分數是多少?
題目會給們一個陣列,還有一個k值。 接著進行比大小的遊戲,規則如下: 每次取陣列前兩個元素值比大小,比較小的會被重新安排到陣列最後方,陣列前兩個元素值比大小,同樣的,比較小的會被重新安排到陣列最後方。依此類推,反覆進行比大小的遊戲。 請問第一個能連贏k回合的是哪個數字?
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
2023 已經過了兩個月,回歸到 2022 的年底,有多少人會開始列下未來一年的 Bucket List ,厲害的人每年的清單都看不到重複的,也有人每年都長得差不多,我大概就是那個每年都長得差不多的人。 今年原本也想列出自己的清單,但想想每年幾乎都列差不多的事情,但完成有幾項呢?
Thumbnail
我記得上次想出國,是2020年過年時想去韓國玩,團費記得2萬元之內,感覺不太貴有剛好可以不用特別請假,不過,當時好像開始說有新冠病毒的疫情開始蔓延,再加上家人不想去吧....結果就沒去成功了 現在可以開始規劃,下一個要去的地方了.... 對於今天的主題:你的護照上有幾個章? 作者: 波特風格出版社
Thumbnail
漫漫人生路上總會有幾個帶給你深遠影響的人,就連以獨行俠作為呼號的頂尖飛行員也不例外,身邊幾個同伴雖然不見得都能陪伴他走完人生這條漫漫長路,但卻也各自為他傳奇的一生刻下深刻悠遠的人生印記。 #捍衛戰士 #獨行俠 #傳奇飛行員 #人生同伴 #topgun #dreamteam #bestteam
Thumbnail
在太陽下山前到山脊邊凸出的一個小平台,視野很棒,適合拍照。大多時候一個人獨享;今日不同,已有一位先到,坐在平台面海左邊咕咾石塊上的一片木板。
Thumbnail
對華人而言,過年是個很重大的節日,最近大家都準備過年了,像是大掃除、買伴手禮給親友和部屬,分享過節的喜悅。 那華人比例很高的新加坡,在農曆新年也有放假嗎?在2022年,也是放9天連假嗎?新加坡到底有多少節日呢?讓我們來一探究竟。 跟許多其他國家一樣,新年的第一天 新加坡也有放假。
Thumbnail
我很不喜歡出門,所以我有個目標就是我要在家工作,這樣就可以永遠嚕貓嚕到爽,在家也可以用極其頹廢的糜爛姿態度過一個下午,即便外面颳風下雨也不干我的事,簡直完美。 但是現實就是我還是得乖乖出門上班,可惡。 所以我拜託了我朋友,他也是中文系的,他爽快地答應。 「唉他完全沒發現是兩個人寫的。」
Thumbnail
因為車子壞掉,才有今天的行程   人生的每個階段都有朋友的誕生,有的朋友很好笑,有的朋友很可靠,有的朋友很有趣,有的朋友像小白目,這就是生活有趣的地方。   記得上次玩得很瘋,笑到合不龍嘴的時候嗎?   生活就是成長過程當中最重要的養分,我們所經歷的一切事物,都會慢慢地變成生命中讀一無二的故事...
Thumbnail
中國大型地產商恆大深陷債務危機,這支擁有恆大足球的集團,在前幾年逾中超甚至是亞洲都呼風喚雨,還進入了中國男足國家隊核心,如今真有「眼看他起高樓,眼看他宴賓客,眼看他樓塌了」的感觸,而中國在前幾年因應中國政策一帶一路,不少企業收購了許多歐洲的球隊,有的經營不錯,但也有的是黯淡收場,五大聯賽(英超、義甲
Thumbnail
四歲的小女孩,總是一個人在家裡塗塗畫畫,可以畫好久好久。 第一次見面,她站在離我好遠的地方,靜靜的、疑惑的、睡眼惺忪的看著我。 「哈囉!妳好。我是小狐。」 她沒有想靠近我的意思,一句話也不說。 「妳想聽我說故事嗎?」我試著邀請她。 小女孩點點頭,但還是不肯靠我近一點。 於是我就這樣開始說故事
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
2023 已經過了兩個月,回歸到 2022 的年底,有多少人會開始列下未來一年的 Bucket List ,厲害的人每年的清單都看不到重複的,也有人每年都長得差不多,我大概就是那個每年都長得差不多的人。 今年原本也想列出自己的清單,但想想每年幾乎都列差不多的事情,但完成有幾項呢?
Thumbnail
我記得上次想出國,是2020年過年時想去韓國玩,團費記得2萬元之內,感覺不太貴有剛好可以不用特別請假,不過,當時好像開始說有新冠病毒的疫情開始蔓延,再加上家人不想去吧....結果就沒去成功了 現在可以開始規劃,下一個要去的地方了.... 對於今天的主題:你的護照上有幾個章? 作者: 波特風格出版社
Thumbnail
漫漫人生路上總會有幾個帶給你深遠影響的人,就連以獨行俠作為呼號的頂尖飛行員也不例外,身邊幾個同伴雖然不見得都能陪伴他走完人生這條漫漫長路,但卻也各自為他傳奇的一生刻下深刻悠遠的人生印記。 #捍衛戰士 #獨行俠 #傳奇飛行員 #人生同伴 #topgun #dreamteam #bestteam
Thumbnail
在太陽下山前到山脊邊凸出的一個小平台,視野很棒,適合拍照。大多時候一個人獨享;今日不同,已有一位先到,坐在平台面海左邊咕咾石塊上的一片木板。
Thumbnail
對華人而言,過年是個很重大的節日,最近大家都準備過年了,像是大掃除、買伴手禮給親友和部屬,分享過節的喜悅。 那華人比例很高的新加坡,在農曆新年也有放假嗎?在2022年,也是放9天連假嗎?新加坡到底有多少節日呢?讓我們來一探究竟。 跟許多其他國家一樣,新年的第一天 新加坡也有放假。
Thumbnail
我很不喜歡出門,所以我有個目標就是我要在家工作,這樣就可以永遠嚕貓嚕到爽,在家也可以用極其頹廢的糜爛姿態度過一個下午,即便外面颳風下雨也不干我的事,簡直完美。 但是現實就是我還是得乖乖出門上班,可惡。 所以我拜託了我朋友,他也是中文系的,他爽快地答應。 「唉他完全沒發現是兩個人寫的。」
Thumbnail
因為車子壞掉,才有今天的行程   人生的每個階段都有朋友的誕生,有的朋友很好笑,有的朋友很可靠,有的朋友很有趣,有的朋友像小白目,這就是生活有趣的地方。   記得上次玩得很瘋,笑到合不龍嘴的時候嗎?   生活就是成長過程當中最重要的養分,我們所經歷的一切事物,都會慢慢地變成生命中讀一無二的故事...
Thumbnail
中國大型地產商恆大深陷債務危機,這支擁有恆大足球的集團,在前幾年逾中超甚至是亞洲都呼風喚雨,還進入了中國男足國家隊核心,如今真有「眼看他起高樓,眼看他宴賓客,眼看他樓塌了」的感觸,而中國在前幾年因應中國政策一帶一路,不少企業收購了許多歐洲的球隊,有的經營不錯,但也有的是黯淡收場,五大聯賽(英超、義甲
Thumbnail
四歲的小女孩,總是一個人在家裡塗塗畫畫,可以畫好久好久。 第一次見面,她站在離我好遠的地方,靜靜的、疑惑的、睡眼惺忪的看著我。 「哈囉!妳好。我是小狐。」 她沒有想靠近我的意思,一句話也不說。 「妳想聽我說故事嗎?」我試著邀請她。 小女孩點點頭,但還是不肯靠我近一點。 於是我就這樣開始說故事