LeetCode 1239. 串联字符串的最大长度

本文介绍了一种使用深度优先搜索解决字符串去重问题的方法,通过将26个字母转换为32位二进制,利用异或操作检测重复字母。博主参考了花花酱的视频教程,展示了C++中模板函数和匿名函数在代码实现中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题链接
思路:

  1. 将26个字母用32位二进制表示独立。
  2. 如果两个string字母均不同,则二者做与操作结果为0.
  3. 将没有重复字母的string挑出来,转换为数字处理
  4. 按照深度优先处理

参考了花花酱的B站视频:

代码中使用了模板函数C++匿名函数,值得学习。

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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值