美文网首页
LeetCode #1079 Letter Tile Possi

LeetCode #1079 Letter Tile Possi

作者: air_melt | 来源:发表于2022-03-26 00:56 被阅读0次

    1079 Letter Tile Possibilities 活字印刷

    Description:
    You have n tiles, where each tile has one letter tiles[i] printed on it.

    Return the number of possible non-empty sequences of letters you can make using the letters printed on those tiles.

    Example:

    Example 1:

    Input: tiles = "AAB"
    Output: 8
    Explanation: The possible sequences are "A", "B", "AA", "AB", "BA", "AAB", "ABA", "BAA".

    Example 2:

    Input: tiles = "AAABBC"
    Output: 188

    Example 3:

    Input: tiles = "V"
    Output: 1

    Constraints:

    1 <= tiles.length <= 7
    tiles consists of uppercase English letters.

    题目描述:
    你有一套活字字模 tiles,其中每个字模上都刻有一个字母 tiles[i]。返回你可以印出的非空字母序列的数目。

    注意:本题中,每个活字字模只能使用一次。

    示例 :

    示例 1:

    输入:"AAB"
    输出:8
    解释:可能的序列为 "A", "B", "AA", "AB", "BA", "AAB", "ABA", "BAA"。

    示例 2:

    输入:"AAABBC"
    输出:188

    示例 3:

    输入:"V"
    输出:1

    提示:

    1 <= tiles.length <= 7
    tiles 由大写英文字母组成

    思路:

    DFS
    本质上就是求字符串的非空子集
    先计算每一个字符出现的次数
    再对出现的次数进行深度优先搜索去重即可
    时间复杂度O(2 ^ n), 空间复杂度O(1)

    代码:
    C++:

    class Solution 
    {
    public:
        int numTilePossibilities(string tiles) 
        {
            vector<int> count(26);
            for (const auto& c : tiles) ++count[c - 'A'];
            return dfs(count);
        }
    private:
        int dfs(vector<int>& count)
        {
            int result = 0;
            for (int i = 0; i < 26; i++)
            {
                if (count[i])
                {
                    ++result;
                    --count[i];
                    result += dfs(count);
                    ++count[i];
                }
            }
            return result;
        }
    };
    

    Java:

    class Solution {
        public int numTilePossibilities(String tiles) {
            int[] count = new int[26];
            for (char c : tiles.toCharArray()) ++count[c - 'A'];
            return dfs(count);
        }
        
        private int dfs(int[] count) {
            int sum = 0;
            for (int i = 0; i < 26; i++) {
                if (count[i] > 0) {
                    sum++;
                    count[i]--;
                    sum += dfs(count);
                    count[i]++;
                }
            }
            return sum;
        }
    }
    

    Python:

    class Solution:
        def numTilePossibilities(self, tiles: str) -> int:
            return len(set([j for i in range(1, len(tiles) + 1) for j in permutations(tiles, i)]))
    

    相关文章

      网友评论

          本文标题:LeetCode #1079 Letter Tile Possi

          本文链接:https://www.haomeiwen.com/subject/wwejjrtx.html