0%

1079. 活字印刷

1079.活字印刷

题目描述:

一套活字字模tiles,每个字模上都刻有一个字母tiles[i]。返回可以印出的非空字母序列的数目。存在重复字模,但是每个字模只能使用一次。

数据范围: $1\le tiles.length \le 7$

题解:

类似全排列问题。排列问题搜索树需要对每一个 tiles[i] 创建分支,排列问题分支数比较多。组合问题需要对 tiles[i]创建选与不选分支,固定两个分支。

但是这个问题是部分排列,不需要搜索到叶子结点再计数,需要对每个节点计数,除去根节点。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
auto optimize_cpp_stdio = []()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
return 0;
}();
class Solution
{
public:
int ans = 0;
int n;
vector<bool> vis;
void dfs(int step, string &s)
{
++ans;
for (int i = 0; i < n; ++i)
{
if (vis[i])
continue;
if (i > 0 && s[i] == s[i - 1] && !vis[i - 1])
continue;
vis[i] = true;
dfs(i + 1, s);
vis[i] = false;
}
}
int numTilePossibilities(string tiles)
{
n = tiles.size();
vis.resize(n, false);
sort(tiles.begin(), tiles.end());
dfs(0, tiles);
return ans - 1;
}
};

image-20230519111526868