【刷题】Leetcode 1239. Maximum Length of a Concatenated String with Unique Characters

做一道新题。

Example 1:

Input: arr = [“un”,“iq”,“ue”]
Output: 4
Explanation: All possible concatenations are “”,“un”,“iq”,“ue”,“uniq” and “ique”.
Maximum length is 4.
在这里插入图片描述图转自花花酱
用bitmask

class Solution {
    int max = 0;
    public int maxLength(List<String> arr) {      
        List<Integer> list = new LinkedList<Integer>();       
        for(String a: arr){
            int curMask = 0;
            for(int i = 0; i < a.length(); i++){             
                curMask = curMask | (1 << a.charAt(i) -'a');                
            } 
            if(Integer.bitCount(curMask) != a.length())
                    continue;
                list.add(curMask);
        }
        helper(list, 0, 0);
        return max;
    }
    
    public void helper(List<Integer> list, int n, int mask){                       
        int count = Integer.bitCount(mask);
        max = Math.max(count, max);
        for(int i = n; i < list.size(); i++){    
            if((mask & list.get(i)) == 0)
            {
               helper(list, i + 1, mask | list.get(i));
            }                          
        }   
    }
}

用set做也可以

class Solution {
    int max = 0;
    public int maxLength(List<String> arr) {      
        if(arr == null)
            return 0;
        helper(arr, "", 0);
        return max;
    }    
    public void helper(List<String> arr, String path, int n){
        max = Math.max(max, path.length());
        for(int i = n; i < arr.size(); i++){
            if(isUnique(path + arr.get(i))){
                helper(arr, path + arr.get(i), i + 1);
            }
        }
    }
    public boolean isUnique(String path){
        HashSet<Character> set = new HashSet<Character>();
        for(int i = 0; i < path.length(); i++){
            if(set.contains(path.charAt(i)))
                return false;
            set.add(path.charAt(i));
        }
        return true;
    }
  
}

总结

  • 先把string转成bitmask
  • Integer.bitCount()求1的个数
### 如何用C++在LeetCode的最佳实践 #### 使用C++进行LeetCode编程练习的重要性 由于C++设计感强,STL作为其泛型编程的杰出代表作,在掌握了C++基本语法以及STL中的容器与算法之后,已经具备了解决大多数编程挑战的基础[^1]。 #### 资源推荐 为了更高效地利用C++在LeetCode平台上进行训练,《剑指 Offer》这本书籍及其配套的Python、Java和C++解代码库是一个很好的起点。此资源不仅提供详细的解答思路,还涵盖了多种实现方式,有助于加深对问的理解[^2]。 #### 平台特点 LeetCode平台本身拥有大量精心挑选并按难度分级编排的问集,这些问广泛涉及各种类型的算法和数据结构,非常适合用来提高个人技能水平。更重要的是,这些目通常反映了实际工作中可能遇到的情况或是编程比赛中的典型考形式[^3]。 #### 策略 当准备着手解决问时,建议先浏览一下该所关联的知识领域标签(例如:“数组”,“字符串”,“链表”),这样可以帮助快速定位所需复习的概念和技术要点。针对不同的数据结构类别采取相应的学习方法: - **链表**:重点在于理解指针的工作原理及如何有效地管理内存分配; - **树和图**:则需深入研究递归遍历和其他高级搜索技术来应对更加复杂的逻辑关系[^4]。 ```cpp // 示例:简单的二分查找函数实现 #include <vector> using namespace std; int binarySearch(const vector<int>& nums, int target) { int left = 0; int right = nums.size() - 1; while (left <= right) { int mid = left + (right - left) / 2; // 防止溢出 if (nums[mid] == target) return mid; else if (nums[mid] < target) left = mid + 1; else right = mid - 1; } return -1; // 如果找不到目标,则返回-1表示未找到 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值