zoukankan      html  css  js  c++  java
  • Leetcode 1239. 串联字符串的最大长度

    地址 https://leetcode-cn.com/problems/maximum-length-of-a-concatenated-string-with-unique-characters/submissions/

    给定一个字符串数组 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] 中只含有小写英文字母

    题解:

    1 首先考虑DFS 遍历各种组合 

    2 考虑使用bit代表各个字符出现与否

      这里为了代码写的方便 使用了一个26长度的数组 记录字符是否出现与否

    代码

    class Solution {
    public:
        vector<int>  currenthash;
    int currentLen;
    vector<vector<int>> hashVec;
    int ret = -9999;
    
    bool CheckHash(vector<int>& hash1, vector<int>& hash2) {
        for (int i = 0; i < hash1.size(); i++) {
            if (hash1[i] + hash2[i] > 1)
                return false;
        }
    
        return true;
    }
    
    void startTry(int idx,int currentLen, vector<string>& arr)
    {
        if (idx == arr.size()) {
            ret = max(ret, currentLen);
            return;
        }
    
        if (CheckHash(currenthash, hashVec[idx])) {
            currentLen += arr[idx].size();
            for (int i = 0; i < currenthash.size(); i++) {
                currenthash[i] += hashVec[idx][i];
            }
            startTry(idx + 1, currentLen,arr);
            for (int i = 0; i < currenthash.size(); i++) {
                currenthash[i] -= hashVec[idx][i];
            }
            currentLen -= arr[idx].size();
        }
        startTry(idx + 1, currentLen, arr);
    
    }
    
    int maxLength(vector<string>& arr) {
        currenthash = vector<int>(26, 0);
        currentLen = 0;
        hashVec = vector<vector<int>>(arr.size(), vector<int>(26, 0));
    
        for (int i = 0; i < arr.size(); i++) {
            for (int j = 0; j < arr[i].size(); j++) {
                int idx = arr[i][j] - 'a';
                hashVec[i][idx]++;
                //优化
            }
        }
    
        currenthash = vector<int>(26, 0);
        currentLen = 0;
        startTry(0, 0,arr);
        return ret;
    }
    
    };
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    PHP合并数组array_merge函数运算符加号与的区别
    PHP 字符串为空
    50段超实用CSS代码(1)
    WCF 第三章 信道 总结
    WCF 第三章 信道 操作契约和信道形状
    WCF 第三章 信道
    WCF 第三章 信道形状
    WCF 第二章 契约 数据契约版本
    WCF 第二章 契约 消息契约
    WCF 第二章 契约 系列文章
  • 原文地址:https://www.cnblogs.com/itdef/p/11762027.html
Copyright © 2011-2022 走看看