日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

每日一题:1220. 统计元音字母序列的数目(Count Vowels Permutation)

發(fā)布時間:2023/12/9 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 每日一题:1220. 统计元音字母序列的数目(Count Vowels Permutation) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

這題是7/4/2021英文站leetcode的每日一題, 想把自己的想法和思路記錄下來.

題目:

Given an integer?n, your task is to count how many strings of length?n?can be formed under the following rules:

  • Each character is a lower case vowel?('a',?'e',?'i',?'o',?'u')
  • Each vowel?'a'?may only be followed by an?'e'.
  • Each vowel?'e'?may only be followed by an?'a'?or an?'i'.
  • Each vowel?'i'?may not?be followed by another?'i'.
  • Each vowel?'o'?may only be followed by an?'i'?or a?'u'.
  • Each vowel?'u'?may only be followed by an?'a'.

Since the answer?may be too large,?return it modulo?10^9 + 7.

Example 1:

Input: n = 1 Output: 5 Explanation: All possible strings are: "a", "e", "i" , "o" and "u".

Example 2:

Input: n = 2 Output: 10 Explanation: All possible strings are: "ae", "ea", "ei", "ia", "ie", "io", "iu", "oi", "ou" and "ua".

Example 3:?

Input: n = 5 Output: 68

思路:

看到題我的第一個想法是用backtracking,因?yàn)橹坝胋acktracking做過其他permutation的題.但是看到數(shù)據(jù)量(1<=n<=2*10^4)我就放棄了,用backtracking做絕對超時. 于是根據(jù)提示,我的新想法是用動態(tài)規(guī)劃去做.

重新梳理了題目之后發(fā)現(xiàn)需要返回的結(jié)果是總數(shù),不是可能的permutation. 那么動態(tài)規(guī)劃確實(shí)是一個很好的方法. 一開始的思路是用一個大小是(n,6)2d的array去存儲所有可能解的數(shù)量, 每一行存儲當(dāng)前長度下(1 - n) 每個原音字母的所有permutation長度,前五個列分別代表五個元音字母,第六列存儲最后的permutation總數(shù)之和。從1開始,每行每列根據(jù)array里先前的數(shù)值遞增,直到長度為n。最后返回第六列所有數(shù)值之和%(10^9+7)。想的很美,但是在實(shí)現(xiàn)時問題不少。 例如每個元音的可能的permutation長度其實(shí)和本身之前的permuta長度并沒有關(guān)系,每個元音生成permutation的方法也不一樣。于是我放棄了這個方法。

參考完官方的解之后,我發(fā)現(xiàn)我的第一步是沒錯的,可以用類似的方法去解,但是需要將每一個元音的permutation長度分開,存儲為5個長度為n的1d的array。參考官方解提供的每個元音與其他的元音序列的關(guān)系,每個元音序列的更新算式也就出來了

圖1: 每個元音序列的關(guān)系 (https://leetcode.com/problems/count-vowels-permutation/solution/)

a的可能的序列 = e,i,和u的前一個序列的總和,因?yàn)樗麄兒竺婵梢愿鷄

e的可能的序列 = a,i的前一個序列的總和,因?yàn)樗麄兒竺婵梢愿鷈

以此類推。。。

在更新完這五個permutation的array之后,將他們最后的值相加,再%10*9+7就可以得到結(jié)果了

代碼:(c++)

class Solution { public:int mod = 1000000007;int countVowelPermutation(int n) {vector<long> aCount(n,1);vector<long> eCount(n,1);vector<long> iCount(n,1);vector<long> oCount(n,1);vector<long> uCount(n,1);for (int i=1; i < n; i++){aCount[i] =(eCount[i-1]+iCount[i-1]+uCount[i-1])%mod;eCount[i] = (aCount[i-1]+iCount[i-1])%mod;iCount[i] = (eCount[i-1]+oCount[i-1])%mod;oCount[i] = (iCount[i-1])%mod;uCount[i] = (iCount[i-1]+oCount[i-1])%mod;}long res = (aCount[n-1]+eCount[n-1]+iCount[n-1]+oCount[n-1]+uCount[n-1])%mod;return (int)res;} };

結(jié)果:

總結(jié)

以上是生活随笔為你收集整理的每日一题:1220. 统计元音字母序列的数目(Count Vowels Permutation)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。