mirror of
https://gitlab.com/mfocko/LeetCode.git
synced 2024-11-10 00:09:06 +01:00
cpp: add “1239. Maximum Length of a Concatenated String with Unique Characters”
Signed-off-by: Matej Focko <me@mfocko.xyz>
This commit is contained in:
parent
0308502e2d
commit
848381110f
1 changed files with 66 additions and 0 deletions
|
@ -0,0 +1,66 @@
|
|||
#include <bit>
|
||||
#include <cassert>
|
||||
#include <cstdint>
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
class Solution {
|
||||
static auto construct_sets(const std::vector<std::string> &arr)
|
||||
-> std::vector<uint32_t> {
|
||||
std::vector<std::uint32_t> sets;
|
||||
|
||||
for (const auto &word : arr) {
|
||||
std::uint32_t w = 0;
|
||||
|
||||
for (char c : word) {
|
||||
auto mask = 1 << (c - 'a');
|
||||
|
||||
if ((w & mask) != 0) {
|
||||
w = 0;
|
||||
break;
|
||||
}
|
||||
w |= mask;
|
||||
}
|
||||
|
||||
sets.push_back(w);
|
||||
}
|
||||
|
||||
return sets;
|
||||
}
|
||||
|
||||
static auto find_solution(const std::vector<std::uint32_t> &words,
|
||||
std::size_t i, std::uint32_t w) -> int {
|
||||
if (i == words.size()) {
|
||||
return std::popcount(w);
|
||||
}
|
||||
|
||||
auto found_solution = find_solution(words, i + 1, w);
|
||||
if ((words[i] & w) == 0) {
|
||||
found_solution = std::max(
|
||||
found_solution, find_solution(words, i + 1, w | words[i]));
|
||||
}
|
||||
|
||||
return found_solution;
|
||||
}
|
||||
|
||||
public:
|
||||
int maxLength(const std::vector<std::string> &arr) {
|
||||
auto sets = construct_sets(arr);
|
||||
return find_solution(sets, 0u, 0u);
|
||||
}
|
||||
};
|
||||
|
||||
int main() {
|
||||
Solution s;
|
||||
|
||||
assert(s.maxLength(std::vector{std::string{"un"}, std::string{"iq"},
|
||||
std::string{"ue"}}) == 4);
|
||||
assert(s.maxLength(std::vector{std::string{"cha"}, std::string{"r"},
|
||||
std::string{"act"}, std::string{"ers"}}) ==
|
||||
6);
|
||||
assert(s.maxLength(
|
||||
std::vector{std::string{"abcdefghijklmnopqrstuvwxyz"}}) == 26);
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in a new issue