leetcode —— 1079. 活字印刷

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

示例 1:

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

示例 2:

输入:“AAABBC”
输出:188

提示:

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

——————
解题思路:使用递归回溯,建立树状结构,统计给定 t i l e s tiles tiles中不同字符的数量,创建一个一维数组 ( 1 , 26 ) (1,26) (1,26)用于保存 t i l e s tiles tiles中不同字符的数量。通过深度遍历寻找不同的排列组合个数。

在此借用leetcode解题大佬liweiwei的解题图片进行表示:
leetcode —— 1079. 活字印刷_第1张图片
其c++代码如下所示:

class Solution 
{
private:
    int nums[26]={0};
public:
    int numTilePossibilities(string tiles) 
    {
        for(int i=0;i<tiles.size();++i)  # 观察给定字符串中不同字符的数量
        {
            nums[tiles[i]-'A']+=1;
        }
        return function(nums);
    }
    int function(int* nums)  # 递归回溯函数
    {
        int num = 0;  # 注意这个变量必须在函数中,否则容易导致出错(设置为全局变量会导致出错)
        for(int i=0;i<26;++i)
        {
            if(nums[i]==0)
                continue;
            num = num + 1;
            nums[i]--;
            num = num + function(nums);
            nums[i]++;
        }
        return num;
    }
};

你可能感兴趣的:(LeetCode算法题)