https://leetcode-cn.com/problems/maximum-length-of-a-concatenated-string-with-unique-characters/
思路:dfs+回溯是比较容易看出来的。关键点在于重复字符的判断,如果每次都暴力遍历字符串计数的话,复杂度就太高了,我们可以使用二进制的思想,把一个字符串所含有的字符表示为一个二进制数,那么判断两个字符串是否有重复字符就很简单了,只需要把两个二进制数相与,看结果是否为0即可。
class Solution {
public:
int getMask(const string &s)
{
int mask=0;
for(char ch:s)
{
int tmp=1<<(ch-'a');
if(mask&tmp)
return 0;
mask|=tmp;
}
return mask;
}
bool check(const vector<int>& masks,int mask)
{
if(!mask)
return 0;
for(int ele:masks)
if(ele&mask)
return 0;
return 1;
}
int dfs(const vector<string>& arr,int idx,vector<int>& masks)
{
if(idx>=arr.size())
return 0;
int mask=getMask(arr[idx]),ans=0;
if(check(masks,mask))
{
masks.push_back(mask);
ans=dfs(arr,idx+1,masks)+arr[idx].size();
masks.pop_back();
}
ans=max(ans,dfs(arr,idx+1,masks));
return ans;
}
int maxLength(vector<string>& arr) {
vector<int> masks;
return dfs(arr,0,masks);
}
};