b_lc_统计字典序元音字符串的数目(bfs / 递推)

给你一个整数 n,请返回长度为 n 、仅由元音 (a, e, i, o, u) 组成且按 字典序排列 的字符串数量。

char m[5]={'a','e','i','o','u'};
class Solution {
public:
    struct node {
        char c;
        int len;
    };
    int countVowelStrings(int n) {
        int ans=0;
        queue<node> q;
        for (char& t : m) q.push({t,1});
        while (!q.empty()) {
            node now=q.front(); q.pop();
            if (now.len==n) ans++;
            if (now.len>n) break;
            for (char& t : m) if (t>=now.c) {
                q.push({t,now.len+1});
            }
        }
        return ans;
    }
};

思路:比赛写的暴力bfs(40/41),但是超时使我的灵感来了
f[i][j]表示长度为i且以字符j为结尾的方案数,f[i][j]+=f[i-1][k](k<=j)

class Solution {
public:
    int ans,f[55][55];
    int countVowelStrings(int n) {
        for (int j=0; j<5; j++) f[1][j]=1;
        for (int i=2; i<=n; i++)
        for (int j=0; j<5; j++)
        for (int k=0; k<=j; k++)
            f[i][j]+=f[i-1][k];
        for (int j=0; j<5; j++) ans+=f[n][j];
        return ans;
    }
};

还有时、空都更优的解法,f[j]表示以字符j结尾的方案数,f[j]=f[j]+f[j-1]

class Solution {
public:
    int ans, f[55];
    int countVowelStrings(int n) {
        for (int j=0; j<5; j++) f[j]=1;
        for (int i=1; i<n; i++)
        for (int j=1; j<5; j++)
            f[j]+=f[j-1];
        for (int j=0; j<5; j++) ans+=f[j];
        return ans;
    }
};
posted @ 2020-11-01 19:10  童年の波鞋  阅读(75)  评论(0编辑  收藏  举报