LeetCode 1239. 串联字符串的最大长度(回溯/动态规划)

文章目录

    • 1. 题目
    • 2. 解题
      • 2.1 回溯超时解
      • 2.2 回溯优化
      • 2.3 动态规划

1. 题目

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-length-of-a-concatenated-string-with-unique-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

2.1 回溯超时解

class Solution {int maxlen = 0;
public:int maxLength(vector<string>& arr) {int count = 0;dfs(arr, count, 0, 0);return maxlen;}void dfs(vector<string>& arr, int count, int idx, int len){bool ok;for(int i = idx, j; i < arr.size(); ++i){	//不应该加这层循环,超时了!!!ok = true;for(j = 0; j < arr[i].size(); ++j){if((count>>(arr[i][j]-'a'))&1)//已经存在该字符{ok = false;break;}}if(ok){for(j = 0; j < arr[i].size(); ++j){count |= (1<<(arr[i][j]-'a'));}len += arr[i].size();maxlen = max(maxlen, len);dfs(arr, count, idx+1, len);len -= arr[i].size();for(j = 0; j < arr[i].size(); ++j){count &= ~(1<<(arr[i][j]-'a'));}}}}
};

2.2 回溯优化

  • 把每个字符的状态存在 int 的二进制位上
  • 每个单词两种选择,选或者不选
class Solution {int maxlen = 0;
public:int maxLength(vector<string>& arr) {dfs(arr, 0, 0, 0);return maxlen;}void dfs(vector<string>& arr, int count, int i, int len){maxlen = max(maxlen, len);if(i == arr.size())return;int j, origin = count;for(j = 0; j < arr[i].size(); ++j){if((count>>(arr[i][j]-'a'))&1)//已经存在该字符{return dfs(arr, origin, i+1, len);//这个单词不选}count |= (1<<(arr[i][j]-'a'));}dfs(arr, origin, i+1, len);//该单词不选	    		dfs(arr, count, i+1, len+arr[i].size()); //该单词选}
};

8 ms 8.2 MB

2.3 动态规划

class Solution {
public:int maxLength(vector<string>& arr) {int i, j, n = arr.size(), maxlen = 0, state, nextstate;bool ok;map<int,int> dp;//字符数状态int表示,最大长度dp[0] = 0;for(i = 0; i < n; ++i){for(auto it = dp.rbegin(); it != dp.rend(); ++it){	//逆序遍历,新生成的状态加在末尾了不会干扰本次//本题正序,也可以,因为同一个单词加2次肯定重复,//不会新生成下一个state,但是无畏的遍历多了,耗时788 ms	13.8 MBstate = it->first;nextstate = state;ok = true;for(j = 0; j < arr[i].size(); ++j){if((nextstate>>(arr[i][j]-'a'))&1)//该位存在{ok = false;break;}nextstate |= (1<<(arr[i][j]-'a'));}if(ok){dp[nextstate] = max(dp[nextstate], int(dp[state]+arr[i].size()));maxlen = max(maxlen, dp[nextstate]);}}}return maxlen;}
};

184 ms 13.6 MB

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/475751.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 伪造gps位置,在Android中使用GPS的假位置

您正在开发一个将设置坐标(经度和纬度)的应用程序.它必须显示我的位置,因为我在那个坐标.它类似于位置欺骗者.. http://www.androidzoom.com/android_applications/tools/location-spoofer_gkmc.html但我没有这样做..这是我的代码..请任何人帮助我.public class Mock extends M…

LeetCode 395. 至少有K个重复字符的最长子串(分治)

1. 题目 找到给定字符串&#xff08;由小写字符组成&#xff09;中的最长子串 T &#xff0c; 要求 T 中的每一字符出现次数都不少于 k 。输出 T 的长度。 示例 1: 输入: s "aaabb", k 3 输出: 3 最长子串为 "aaa" &#xff0c;其中 a 重复了 3 次。示…

WCF 体系结构图

转载于:https://www.cnblogs.com/agressivo/articles/1958858.html

android studio电影院选座,8排电影院选座最佳位置

8排电影院选座最佳位置在哪里呢&#xff1f;8排电影院属于小影厅&#xff0c;小影厅银幕宽度在10米以下&#xff0c;座位100以内&#xff0c;座位排数通常拥有8-14排&#xff0c;小影厅整体空间小&#xff0c;选座时要选中间稍靠后一些的位置。由于整体排数少&#xff0c;因此选…

LeetCode 1011. 在 D 天内送达包裹的能力(二分查找)

1. 题目 传送带上的包裹必须在 D 天内从一个港口运送到另一个港口。 传送带上的第 i 个包裹的重量为 weights[i]。每一天&#xff0c;我们都会按给出重量的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。 返回能在 D 天内将传送带上的所有包裹送达的船的…

仿Jquery链式操作的xml操作类

经常需要对xml文件进行操作&#xff0c;参考了Jquery的链式操作后实现了xmlHelper类。代码usingSystem;usingSystem.Data;usingSystem.Configuration;usingSystem.Xml;namespaceConfigUpdate{ ///<summary>///调用非静态的操作方法的 ///</summary>publiccla…

4月17日鸿蒙开发者大会,4月17日这天,将载入华为史册

文/笨鸟原创不易&#xff0c;禁止抄袭、洗稿&#xff0c;违者必究&#xff01;万众瞩目的华为鸿蒙系统对于国人来说&#xff0c;一部智能手机只有实现了芯片和系统技术的自主化&#xff0c;才能被称之为真正的国产手机。而就目前的国内手机市场而言&#xff0c;除华为之外的所有…

LeetCode 875. 爱吃香蕉的珂珂(二分查找)

1. 题目 珂珂喜欢吃香蕉。这里有 N 堆香蕉&#xff0c;第 i 堆中有 piles[i] 根香蕉。警卫已经离开了&#xff0c;将在 H 小时后回来。 珂珂可以决定她吃香蕉的速度 K &#xff08;单位&#xff1a;根/小时&#xff09;。每个小时&#xff0c;她将会选择一堆香蕉&#xff0c;…

MsSql正反表达式

例子&#xff1a; UPDATE [Photo_Table] SET istopistop^1,IsTopDateTimegetdate() WHERE charindex(, rtrim(PHOTOID) , , , PHOTOIDLIST ,)>0转载于:https://www.cnblogs.com/yibinboy/archive/2011/02/22/1961675.html

LeetCode 1455. 检查单词是否为句中其他单词的前缀

1. 题目 给你一个字符串 sentence 作为句子并指定检索词为 searchWord &#xff0c;其中句子由若干用 单个空格 分隔的单词组成。 请你检查检索词 searchWord 是否为句子 sentence 中任意单词的前缀。 如果 searchWord 是某一个单词的前缀&#xff0c;则返回句子 sentence 中…

html怎么修改锚点的属性,在HTML中设置自定义锚点

我已经在帖子here和here中看到了这个话题,但它们并没有真正帮助我.情况非常相似&#xff1a;页面顶部的滚动页面和粘性菜单栏(固定div),锚点分散在长滚动文本中.像这样的HTML&#xff1a;Heading Foothis is some text, and a lot of it...jump to Heading Foo...Heading Blaan…

PHP输出Excel实例代码

这里使用PHPExcel的开源类 一个完整的实例&#xff1a; <?php require_once("../includes/function.php"); //提供了SQL注入检测函数inject_check require_once("../class/DB.php"); //DB操作类&#xff0c;自己扩展一下 $db new DB(); if($_GET[sho…

LeetCode 1456. 定长子串中元音的最大数目(滑动窗口)

1. 题目 给你字符串 s 和整数 k 。 请返回字符串 s 中长度为 k 的单个子字符串中可能包含的最大元音字母数。 英文中的 元音字母 为&#xff08;a, e, i, o, u&#xff09;。 示例 1&#xff1a; 输入&#xff1a;s "abciiidef", k 3 输出&#xff1a;3 解释&a…

Xml文档添加节点和属性

在实际的应用开发中需要我们对xml进行添加节点和属性&#xff0c;动态的去完成&#xff0c;在这之前&#xff0c;先看看XmlNode和XmlElement之间的关系 1、XmlElement继承XmlLinkedNode又继承XmlNode&#xff0c;所以XmlElement是XmlNode的子集&#xff0c;那么从继承的关系来说…

html仿手机界面,javascript新手实例3-仿手机聊天界面(if else运用)

今天给大家一个if else的Javascript小示例&#xff0c;其中我在js文件里写了很多注释&#xff0c;有兴趣的同学自己看注释&#xff0c;另外对于聊天界面的显示方式&#xff0c;我写了两种&#xff0c;大家也可以分别试试&#xff1a;老规矩&#xff0c;先上图&#xff1a;html代…

Android开发环境搭建

刚刚接触Android&#xff0c;发现学的java都忘得差不多了~~分享一下android开发环境的搭建。 1.准备&#xff1a; 1)java sdk1.6 http://www.oracle.com/technetwork/java/javase/downloads/index.html 2)android sdk-windows http://developer.android.com/sdk/index.html 3)…

LeetCode 1457. 二叉树中的伪回文路径(位运算+递归)

1. 题目 给你一棵二叉树&#xff0c;每个节点的值为 1 到 9 。我们称二叉树中的一条路径是 「伪回文」的&#xff0c;当它满足&#xff1a;路径经过的所有节点值的排列中&#xff0c;存在一个回文序列。 请你返回从根到叶子节点的所有路径中 伪回文 路径的数目。 示例 1&…

傅立叶变换计算机网络,中南大学 计算机网络与信号处理考试卷

计算机网络复习习题1一&#xff0e;选择题1、采用全双工工作&#xff0c;数据的传输方向为&#xff1a;()A&#xff0e;双向B。单向C。双向&#xff0c;但不能同时传输D。都不对2、BSC规程采用的成帧方式为()A&#xff0e;字节记数法B。使用字符填充的首尾定界符法C&#xff0c…

LeetCode 1458. 两个子序列的最大点积(动态规划,类似编辑距离)

1. 题目 给你两个数组 nums1 和 nums2 。 请你返回 nums1 和 nums2 中两个长度相同的 非空 子序列的最大点积。 数组的非空子序列是通过删除原数组中某些元素&#xff08;可能一个也不删除&#xff09;后剩余数字组成的序列&#xff0c;但不能改变数字间相对顺序。 比方说&a…

编译html成qch,在应用程序编译过程中运行qcollectiongenerator

我一直在研究一个名为RoboJournal的程序很长一段时间。下一版本包含完整的文档;每当用户按F1或单击RoboJournal程序中的帮助项目时&#xff0c;帮助文件将显示在Qt助手中(比简单地打开浏览器窗口以获得一些联机文档更加方便)。在应用程序编译过程中运行qcollectiongenerator在其…