前往
大廳
主題

LeetCode - 2514. Count Anagrams 解題心得

Not In My Back Yard | 2023-11-13 12:00:01 | 巴幣 0 | 人氣 79

題目連結:


題目意譯:
你被給定一個字串 s,其包含著一個或多個字詞。對於每一對相鄰的字詞之間都會間隔著一個空白 ' '。

一個字串 t 如果 t 中的第 i 個字詞是字串 s 中第 i 個字詞的一個排列,則 t 為 s 的一個易位構詞(Anagram)。

例如說,"acb dfe" 是 "abc def" 的一個易位構詞,但 "def cab" 和 "adc bef" 則不是。

回傳 s 的相異易位構詞之數量。由於答案可能很大,先將其模 10 ^ 9 + 7 後再回傳。

限制:
1 ≦ s.length ≦ 10 ^ 5
s 由小寫英文字母以及空白 ' ' 所組成。
每個相鄰字詞之間會隔著一個空白。



範例測資:
範例 1:
輸入: s = "too hot"
輸出: 18
解釋: 給定字串的一些易位構詞為 "too hot" 、 "oot hot" 、 "oto toh" 、 "too toh" 和 "too oht"。

範例 2:
輸入: s = "aa"
輸出: 1
解釋: 給定的字串只有一種可能的易位構詞。


解題思維:
假設 s 有 C 個字詞,則所求的易位構詞數即為 C 個字詞各自所有可能排列之數量的乘積。以範例 1 的 s = "too hot" 作為例子。則我們可以看到所求即為 "too" 的排列方法數乘以 "hot" 的排列方法數,前者為 3! / 2! = 3、後者為 3! = 6,因此所求 = 3 × 6 = 18。其中「!」代表著階乘運算。

因此我們可以先著重於單一一個字詞的情況。為了求其排列方法數,我們需要知道該字詞各個字母的出現次數。假設其長度為 L,且 'a' ~ 'z' 的出現次數各自為 c1 、 c2 、 …… 、 c26,則方法數為
L! ÷ (c1! × c2! × …… × c26!)
不過由於答案需要求的是模 10 ^ 9 + 7 之後的結果,因此我們需要求階乘的模反元素之運算(可以參見這題)。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

相關創作

更多創作