1079.活字印刷
链接:1079.活字印刷
难度:Medium
标签:哈希表、字符串、回溯、计数
简介:你有一套活字字模 tiles,其中每个字模上都刻有一个字母 tiles[i]。返回你可以印出的非空字母序列的数目。
题解 1 - cpp
- 编辑时间:2023-05-19
- 执行用时:144ms
- 内存消耗:22.7MB
- 编程语言:cpp
- 解法介绍:全排列。
class Solution {
public:
int numTilePossibilities(string tiles) {
unordered_set<string> s;
unordered_set<int> idxs;
function<void(string)> dfs = [&](string cur) {
s.insert(cur);
if (cur.size() == tiles.size()) return;
for (int i = 0; i < tiles.size(); i++) {
if (idxs.count(i)) continue;
idxs.insert(i);
dfs(cur + tiles[i]);
idxs.erase(i);
}
};
dfs("");
return s.size() - 1;
}
};
题解 2 - python
- 编辑时间:2023-05-19
- 执行用时:204ms
- 内存消耗:24.8MB
- 编程语言:python
- 解法介绍:同上。
class Solution:
def numTilePossibilities(self, tiles: str) -> int:
s = set()
idxs = set()
def dfs(cur: str):
s.add(cur)
if len(cur) == len(tiles):
return
for i in range(len(tiles)):
if i in idxs:
continue
idxs.add(i)
dfs(cur + tiles[i])
idxs.remove(i)
dfs('')
return len(s) - 1
题解 3 - rust
- 编辑时间:2023-05-19
- 执行用时:40ms
- 内存消耗:3MB
- 编程语言:rust
- 解法介绍:同上。
impl Solution {
pub fn num_tile_possibilities(tiles: String) -> i32 {
use std::collections::HashSet;
let tiles = tiles.as_bytes().iter().map(|v| *v).collect::<Vec<u8>>();
let mut s = HashSet::<String>::new();
let mut idxs = HashSet::<usize>::new();
fn dfs(
s: &mut HashSet<String>,
idxs: &mut HashSet<usize>,
tiles: &Vec<u8>,
cur: &mut Vec<u8>,
) {
s.insert(String::from_utf8(cur.clone()).unwrap());
if cur.len() != tiles.len() {
for i in 0..tiles.len() {
if !idxs.contains(&i) {
idxs.insert(i);
cur.push(tiles[i]);
dfs(s, idxs, tiles, cur);
cur.pop();
idxs.remove(&i);
}
}
}
}
let mut cur: Vec<u8> = vec![];
dfs(&mut s, &mut idxs, &tiles, &mut cur);
(s.len() - 1) as i32
}
}