題目連結:
題目意譯:
你被給定一個字串 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 之後的結果,因此我們需要求階乘的模反元素之運算(可以參見
這題)。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。