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
class Solution {
private int max;

public int maxLength(List<String> arr) {
int[] charOccur = new int[arr.size()];
for (int i = 0; i < charOccur.length; i++) {
charOccur[i] = getCharOccur(arr.get(i));
}
backtrack(arr, charOccur, 0, 0);
return max;
}

private void backtrack(List<String> arr, int[] charOccur, int currOccur, int pos) {
if (pos == arr.size()) {
max = Math.max(max, getOnes(currOccur));
return;
}

if (charOccur[pos] != -1 && (currOccur & charOccur[pos]) == 0) {
backtrack(arr, charOccur, currOccur | charOccur[pos], pos + 1);
}
backtrack(arr, charOccur, currOccur, pos + 1);
}

private int getCharOccur(String s) {
int ans = 0;
for (char letter : s.toCharArray()) {
int targetPos = (1 << (int) (letter - 'a'));
if ((ans & targetPos) != 0) {
ans = -1;
break;
}
ans |= targetPos;
}
return ans;
}

private int getOnes(int num) {
int ans = 0;
for (int i = 0; i < 26; i++) {
ans += (num & 1);
num >>= 1;
}
return ans;
}
}

backtrack, 用一个int来记录每一个string中出现了哪些char, 如果某个char出现多次, 则该标记为-1. 最后用getOnes来查一查currOccur中有几个1即可.

时间复杂度: O(2^n)
空间复杂度: O(n)