1160 Letter Tile Possibilities
1160 Letter Tile Possibilities
Letter Tile Possibilities 
You have n 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 using the letters printed on those tiles.
Example 1:
1
2
3
4
5
**Input:** tiles = "AAB"
**Output:** 8
**Explanation: **The possible sequences are "A", "B", "AA", "AB", "BA", "AAB", "ABA", "BAA".
Example 2:
1
2
3
4
**Input:** tiles = "AAABBC"
**Output:** 188
Example 3:
1
2
3
4
**Input:** tiles = "V"
**Output:** 1
Constraints:
1
2
1 <= tiles.length <= 7
tiles consists of uppercase English letters.
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
func numTilePossibilities(tiles string) int {
// ABCD
// A,B,C,D
// AB,AC,AD
// ABC, ABD, ACD
mp := make(map[string]bool)
Comb(tiles, "", mp)
fmt.Println(mp)
return len(mp)
}
func Comb(s string, prev string , mp map[string]bool) {
// ABCD
//A, B, C , D
// AB, Ac, AD, BC,BD,...
// ABC, ACD, A
// idea is to keep skipping elements
//fmt.Println(prev + string(s[i]))
for i, _ := range s {
//fmt.Println(prev + string(s[i]))
Perm(prev + string(s[i]), "" ,mp)
Comb(s[i+1:], prev + string(s[i]) , mp)
}
}
func Perm(s string, prev string, mp map[string]bool) {
if len(s) == 2 {
mp[prev + s] = true
mp[prev + string(s[1]) + string(s[0])] = true
return
}
if len(s) == 1 {
mp[prev + s] = true
return
}
for i, _ := range s {
if i + 1 < len(s) {
Perm(string(s[:i]) + s[i+1:], prev + string(s[i]) , mp )
} else {
Perm(string(s[:i]) , prev + string(s[i]) , mp )
}
}
}
This post is licensed under CC BY 4.0 by the author.