2023-05-19每日一题
一、题目编号
1079. 活字印刷
二、题目链接
三、题目描述
你有一套活字字模 tiles,其中每个字模上都刻有一个字母 tiles[i]。返回你可以印出的非空字母序列的数目。
注意:本题中,每个活字字模只能使用一次。
四、解题代码
class Solution {
unordered_map<string, int> mp;
int hash[10];
int cnt = 0;
void dfs(string tiles, string &s){
if(mp[s] == 0 && s.size() != 0){
cnt++;
mp[s] = 1;
}
for(int i = 0; i < tiles.size(); ++i){
if(hash[i] == 0){
hash[i] = 1;
s.push_back(tiles[i]);
dfs(tiles, s);
s.pop_back();
hash[i] = 0;
}
}
}
public:
int numTilePossibilities(string tiles) {
memset(hash, 0, sizeof(hash));
string s;
dfs(tiles, s);
return cnt;
}
};
五、解题思路
(1) 这道题目询问到关于排列组合的问题,问的是字母的全排列,这与数字的全排列是相同的问题,所以考虑到的就是深度优先搜索(或者广度优先搜索)。
(2) 本道题目我们采用的是深度优先搜索,所以需要用哈希表来帮忙记录是否遍历到字符串的字母(在本道题目的意思是活字印刷是否用到该字母)。如果使用的是广度优先搜索,使用的是哈希+队列的模式。
(3) 深度优先搜索中有一个很重要的一点就是判断结果是否重复(即去重),所以我们还用一个哈希表unordered_map来帮忙辅助判断字母序列是否已经存在,如果存在了(即哈希表中有所记录),就不算,如果不存在(即哈希表中没有记录)就统计数目+1。并且在哈希表中标记出该字符串存在。
(4) 最终返回深度优先搜索的结果即可,即全局变量cnt。