题目地址:
https://leetcode.com/problems/maximum-length-of-a-concatenated-string-with-unique-characters/
给定一个字符串数组 A A A,从中挑出若干字符串拼接成一个字符串 s s s,保证 s s s中没有重复字母。问能得到的最长的 s s s的长度。题目保证 A A A里的字符串只含英文小写字母。
思路是DFS。首先为了快速判断两个字符串是否有相同字母,可以将每个字符串占用了哪些字母用一个二进制整数标记,这样两个字符串有相同字母当且仅当它们对应的两个二进制整数做按位与不等于 0 0 0。然后开始DFS,直接枚举所有可能性即可。代码如下:
class Solution {
public:
int maxLength(vector<string>& a) {
vector<int> v;
bool flag = false;
for (auto& s : a) {
int x = 0;
for (char ch : s) {
if (x >> (ch - 'a') & 1) {
// s有重复字母,s是不能用的,将其清空
s = "";
break;
}
x |= 1 << (ch - 'a');
}
v.push_back(s.size() ? x : 0);
}
int res = 0;
dfs(0, 0, 0, v, a, res);
return res;
}
void dfs(int u, int b, int len, vector<int>& v, vector<string>& a, int& res) {
res = max(res, len);
for (int i = u; i < v.size(); i++) {
if (b & v[i]) continue;
dfs(i + 1, b | v[i], len + a[i].size(), v, a, res);
}
}
};
时间复杂度指数级,空间 O ( n ) O(n) O(n), n n n是有多少个字符串。