Skip to content

Commit ee4ed26

Browse files
committed
添加 problem 1079
1 parent c1da758 commit ee4ed26

File tree

3 files changed

+146
-0
lines changed

3 files changed

+146
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package leetcode
2+
3+
// 解法一 DFS
4+
func numTilePossibilities(tiles string) int {
5+
m := make(map[byte]int)
6+
for i := range tiles {
7+
m[tiles[i]] += 1
8+
}
9+
arr := make([]int, 0)
10+
for _, v := range m {
11+
arr = append(arr, v)
12+
}
13+
return numTileDFS(arr)
14+
}
15+
16+
func numTileDFS(arr []int) (r int) {
17+
for i := 0; i < len(arr); i++ {
18+
if arr[i] == 0 {
19+
continue
20+
}
21+
r += 1
22+
arr[i] -= 1
23+
r += numTileDFS(arr)
24+
arr[i] += 1
25+
}
26+
return
27+
}
28+
29+
// 解法二 DFS 暴力解法
30+
func numTilePossibilities_(tiles string) int {
31+
res, tmp, tMap, used := 0, []byte{}, make(map[string]string, 0), make([]bool, len(tiles))
32+
findTile([]byte(tiles), tmp, &used, 0, &res, tMap)
33+
return res
34+
}
35+
36+
func findTile(tiles, tmp []byte, used *[]bool, index int, res *int, tMap map[string]string) {
37+
flag := true
38+
for _, v := range *used {
39+
if v == false {
40+
flag = false
41+
break
42+
}
43+
}
44+
if flag {
45+
return
46+
}
47+
for i := 0; i < len(tiles); i++ {
48+
if (*used)[i] == true {
49+
continue
50+
}
51+
tmp = append(tmp, tiles[i])
52+
(*used)[i] = true
53+
if _, ok := tMap[string(tmp)]; !ok {
54+
//fmt.Printf("i = %v tiles = %v 找到了结果 = %v\n", i, string(tiles), string(tmp))
55+
*res++
56+
}
57+
tMap[string(tmp)] = string(tmp)
58+
59+
findTile([]byte(tiles), tmp, used, i+1, res, tMap)
60+
tmp = tmp[:len(tmp)-1]
61+
(*used)[i] = false
62+
}
63+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package leetcode
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
)
7+
8+
type question1079 struct {
9+
para1079
10+
ans1079
11+
}
12+
13+
// para 是参数
14+
// one 代表第一个参数
15+
type para1079 struct {
16+
one string
17+
}
18+
19+
// ans 是答案
20+
// one 代表第一个答案
21+
type ans1079 struct {
22+
one int
23+
}
24+
25+
func Test_Problem1079(t *testing.T) {
26+
27+
qs := []question1079{
28+
29+
question1079{
30+
para1079{"AAB"},
31+
ans1079{8},
32+
},
33+
34+
question1079{
35+
para1079{"AAABBC"},
36+
ans1079{188},
37+
},
38+
}
39+
40+
fmt.Printf("------------------------Leetcode Problem 1079------------------------\n")
41+
42+
for _, q := range qs {
43+
_, p := q.ans1079, q.para1079
44+
fmt.Printf("【input】:%v 【output】:%v\n", p, numTilePossibilities(p.one))
45+
}
46+
fmt.Printf("\n\n\n")
47+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# [1079. Letter Tile Possibilities](https://leetcode.com/problems/letter-tile-possibilities/)
2+
3+
4+
## 题目
5+
6+
You have a set of `tiles`, where each tile has one letter `tiles[i]` printed on it. Return the number of possible non-empty sequences of letters you can make.
7+
8+
**Example 1:**
9+
10+
Input: "AAB"
11+
Output: 8
12+
Explanation: The possible sequences are "A", "B", "AA", "AB", "BA", "AAB", "ABA", "BAA".
13+
14+
**Example 2:**
15+
16+
Input: "AAABBC"
17+
Output: 188
18+
19+
**Note:**
20+
21+
1. `1 <= tiles.length <= 7`
22+
2. `tiles` consists of uppercase English letters.
23+
24+
## 题目大意
25+
26+
你有一套活字字模 tiles,其中每个字模上都刻有一个字母 tiles[i]。返回你可以印出的非空字母序列的数目。提示:
27+
28+
- 1 <= tiles.length <= 7
29+
- tiles 由大写英文字母组成
30+
31+
## 解题思路
32+
33+
- 题目要求输出所有非空字母序列的数目。这一题是排列和组合的结合题目。组合是可以选择一个字母,二个字母,…… n 个字母。每个组合内是排列问题。比如选择 2 个字母,字母之间相互排序不同是影响最终结果的,不同的排列顺序是不同的解。
34+
- 这道题目由于不需要输出所有解,所以解法可以优化,例如我们在递归计算解的时候,不需要真的遍历原字符串,只需要累加一些字母的频次就可以。当然如果要输出所有解,就需要真实遍历原字符串了(见解法二)。简单的做法是每次递归按照频次累加。因为每次增加一个字母一定是 26 个大写字母中的一个。这里需要注意的是,增加的只能是 26 个字母里面还能取出“机会”的字母,例如递归到到第 3 轮了,A 用完了,这个时候只能取频次还不为 0 的字母拼上去。
35+
36+
![](https://pic.cdn.lizenghai.com/uploads/2019/06/15604249050330956_414598-48d6698970379275.png?x-oss-process=style%2Ffull)

0 commit comments

Comments
 (0)