zoukankan      html  css  js  c++  java
  • [leetcode 周赛 160] 1239 串联字符串的最大长度

    1239 Maximum Length of a Concatenated String with Unique Characters 串联字符串的最大长度

    问题描述

    给定一个字符串数组 arr,字符串 s 是将 arr 某一子序列字符串连接所得的字符串,如果 s 中的每一个字符都只出现过一次,那么它就是一个可行解。

    请返回所有可行解 s 中最长长度。

    示例 1:

    输入: arr = ["un","iq","ue"]
    输出: 4
    解释: 所有可能的串联组合是 "","un","iq","ue","uniq" 和 "ique",最大长度为 4。

    示例 2:

    输入: arr = ["cha","r","act","ers"]
    输出: 6
    解释: 可能的解答有 "chaers" 和 "acters"。

    示例 3:

    输入: arr = ["abcdefghijklmnopqrstuvwxyz"]
    输出: 26

    提示:

    • 1 <= arr.length <= 16
    • 1 <= arr[i].length <= 26
    • arr[i] 中只含有小写英文字母

    思路

    • 读题
      题目需要的字符串是一个没有重复字符的字符串, 所提供的字符串数组, 可以进行拼接, 得到最长的那个没有重复字符的字符串.

    回溯法(递归)+DFS剪枝

    分析算法规模: 递归深度最多16层, 运算规模最大2^17(回溯树上节点)
    遍历所有可能的解, 尝试不同字符串的组合(回溯)
    回溯法

    代码实现

    回溯法(递归)+DFS剪枝

    class Solution {
        private int ans = 0;
    
        public int maxLength(List<String> arr) {
            if (arr == null) {
                return 0;
            }
    
            // 遍历整个字符串数组 获得符合条件的单个字符串最大长度
            for (String ar : arr) {
                if (nonDuplicate(ar)) {
                    ans = Math.max(ar.length(), ans);
                }
            }
            // DFS 从0开始 初始字符串为空串
            helper(arr, 0, "");
    
            return ans;
        }
    
        private void helper(List<String> arr, int idx, String prev) {
            // 剪枝 没有重复(符合条件)才可以继续往下走
            if (nonDuplicate(prev)) {
                ans = Math.max(prev.length(), ans);
            } else {
                return;
            }
    
            // 最后一个节点 返回
            if (idx > arr.size()) {
                return;
            }
            // 当前字符串
            String cur = arr.get(idx);
            // 添加
            helper(arr, idx + 1, prev + cur);
            // 不添加
            helper(arr, idx + 1, prev);
        }
    
        private boolean nonDuplicate(String str) {
            return str.chars().distinct().count() == str.length();
        }
    }
    

    参考资源

    第 160 场周赛 全球排名

  • 相关阅读:

    JVM基础
    rpm、yum、解压缩安装
    Vim使用及账号用户管理
    linux常用操作
    属主权限和属组权限
    解决Hystrix Dashboard 一直是Loading ...的情况
    扫描不到了@FeignClient注解的调用接口
    springcloud与springboot版本问题
    【力扣】6和9组成的最大数字 题解
  • 原文地址:https://www.cnblogs.com/slowbirdoflsh/p/11823510.html
Copyright © 2011-2022 走看看