原题链接
思路:
- 将26个字母用32位二进制表示独立。
- 如果两个string字母均不同,则二者做与操作结果为0.
- 将没有重复字母的string挑出来,转换为数字处理
- 按照深度优先处理
class Solution {
public:
int maxLength(vector<string>& arr) {
vector<int>a;
// 清洗arr, 将string转换为二进制码,再转换为十进制数字存起来
// 并去除string中本身就含有重复字母的单词,比如 cheer
for(const string& x : arr){
int mask = 0;
for(char c : x) mask |= 1 << (c - 'a');
if(__builtin_popcount(mask) != x.length()) continue;
a.push_back(mask);
}
int ans = 0;
// 这里使用了模板函数与C++匿名函数
function<void(int,int)> dfs = [&](int s, int mask){
ans = max(ans, __builtin_popcount(mask));
for(int i = s; i < a.size(); ++i){
if((mask & a[i]) == 0) dfs(i+1, mask | a[i]);
}
};
dfs(0,0);
return ans;
}
};