【动态规划2】leetcode1641 统计字典序元音字符串的数目

1641. 统计字典序元音字符串的数目

文章目录

    • 1641. 统计字典序元音字符串的数目
    • 1.解题思路
    • 2.确定dp数组的意义
    • 3.找到状态转移方程
    • 4.找到dp数组的初始量
    • 5.GO FOR IT!
    • 6.总结

【动态规划2】leetcode1641 统计字典序元音字符串的数目_第1张图片

1.解题思路

首先当 n=1 时,字符串为 [“a”,“e”,“i”,“o”,“u”]
根据题目的意思,当 n=2 时,字符串需要由2个元音字符拼接而成,且满足字典序,可以在 n=1 的基础之上,给每个字符串前面加上新的元音,字母a后面可以跟a、e、i、o、u,字母e后面可跟e、i、o、u,字母i可跟i、o、u,字母o可跟o、u,字母u只能跟u,最后形成 [“aa”,“ae”,“ai”,“ao”,“au”,“ee”,“ei”,“eo”,“eu”,“ii”,“io”,“iu”,“oo”,“ou”,“uu”]
类推,a可以接所有以a、e、i、o、u打头的字符串,e可以接所有以e、i、o、u打头的字符串…
简化,我们只需要记录以a、e、i、o、u打头的字符串分别有多少个,如图所示
【动态规划2】leetcode1641 统计字典序元音字符串的数目_第2张图片

2.确定dp数组的意义

定义dp[n + 1][5],其中dp[i][j]表示n = i时以aeiou打头的字符串的数量有多少个,aeiou分别对应j = 01234

3.找到状态转移方程

由图可以分析出来,n = i时每个字母对应的打头的字符串数等于n = i - 1时字典序小于等于该字母的字符串数

for(int j = 0; j < 5; ++j)
{
	for(int m = j; m < 5; ++m)
	{
		dp[i][j] += dp[i - 1][m];
	}
}

4.找到dp数组的初始量

当n = 1时,dp[1][0~4]的值均为1,因此初始量有了

5.GO FOR IT!

for(int i = 2; i <= n; ++i)
    {
         for(int j = 0; j < 5; ++j)
         {
              for(int m = j; m < 5; ++m)
              {
                  dp[i][j] += dp[i - 1][m];
              }
         }
    }

6.总结

贴一下leetcode代码记录一下
【动态规划2】leetcode1641 统计字典序元音字符串的数目_第3张图片
dp的空间复杂度可以再优化,因为每次计算dp[i][j]时候都使用了dp[i - 1][j~4]各一次,再往前的都没有用到了,所以可以优化为dp[5],只用一个一维的即可。
【动态规划2】leetcode1641 统计字典序元音字符串的数目_第4张图片

你可能感兴趣的:(动态规划,动态规划,leetcode,算法)