跳到主要内容

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
}
}