20240122-具有唯一字符的连接字符串的最大长度

2024-01-26 13:12

本文主要是介绍20240122-具有唯一字符的连接字符串的最大长度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目要求

给你一个字符串数组 arr。字符串 s 由 arr 中具有唯一字符的子序列连接而成。

请返回 s 的最大可能长度。

子序列是一个数组,它可以在不改变其余元素顺序的情况下,通过删除某些元素或不删除任何元素从另一个数组派生出来。

简单来说我们需要组成尽可能长的字符串并且保证出现的字符是唯一的。

Example 1:

Input: arr = ["un","iq","ue"]
Output: 4
Explanation: All the valid concatenations are:
- ""
- "un"
- "iq"
- "ue"
- "uniq" ("un" + "iq")
- "ique" ("iq" + "ue")
Maximum length is 4.

Example 2:

Input: arr = ["cha","r","act","ers"]
Output: 6
Explanation: Possible longest valid concatenations are "chaers" ("cha" + "ers") and "acters" ("act" + "ers").

Example 3:

Input: arr = ["abcdefghijklmnopqrstuvwxyz"]
Output: 26
Explanation: The only string in arr has all 26 characters.

思路

找到由数组中的字符串组合而成的最长唯一字符串。关键点在于“唯一字符”,即任何字符在最终字符串中只能出现一次。

考虑使用‘set’追踪字符唯一性:‘set’自然的保证了其中元素的唯一性,因为不允许重复元素存在。

同一个字符串中的重复元素检查,采用‘insert’方法来判断返回值是否已经存在于‘set’中,如果插入的是已经存在的字符,会返回false。

采用回溯算法逐一探索所有可能的字符串组合。在每一步中:

  • 如果当前考虑的字符串可以无重复地加入到当前组合中,我们就更新当前字符串组合和字符集合,然后递归地探索下一个选择。
  • 完成探索后,通过“回溯”操作撤销上一步的选择,即从当前字符串组合中移除刚才添加的字符串,并从字符集合中删除相应的字符,以恢复到加入新字符串之前的状态。

代码

class Solution {
public:bool isUnique(const string& str, const set<char>& currentSet) {set<char> strSet;for (char c : str) {if (currentSet.find(c) != currentSet.end() || !strSet.insert(c).second) {return false;}}return true;}void backtrack(vector<string>& arr, int startIndex, set<char>& currentSet, string& currentString, int& maxLength) {maxLength = max(maxLength, static_cast<int>(currentString.size()));for (int i = startIndex; i < arr.size(); ++i) {if (isUnique(arr[i], currentSet)) {for (char c : arr[i]) {currentSet.insert(c);}currentString += arr[i];backtrack(arr, i+1, currentSet, currentString, maxLength);for (char c : arr[i]) {currentSet.erase(c);}currentString.erase(currentString.size() - arr[i].size());}}}int maxLength(vector<string>& arr) {int maxLength = 0;set<char> currentSet;string currentString = "";backtrack(arr, 0, currentSet, currentString, maxLength);return maxLength;}
};

时间复杂度

空间复杂度

这篇关于20240122-具有唯一字符的连接字符串的最大长度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/646909

相关文章

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

MySQL 获取字符串长度及注意事项

《MySQL获取字符串长度及注意事项》本文通过实例代码给大家介绍MySQL获取字符串长度及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 获取字符串长度详解 核心长度函数对比⚠️ 六大关键注意事项1. 字符编码决定字节长度2

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

SpringBoot连接Redis集群教程

《SpringBoot连接Redis集群教程》:本文主要介绍SpringBoot连接Redis集群教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 依赖2. 修改配置文件3. 创建RedisClusterConfig4. 测试总结1. 依赖 <de

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

C#如何去掉文件夹或文件名非法字符

《C#如何去掉文件夹或文件名非法字符》:本文主要介绍C#如何去掉文件夹或文件名非法字符的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#去掉文件夹或文件名非法字符net类库提供了非法字符的数组这里还有个小窍门总结C#去掉文件夹或文件名非法字符实现有输入字

使用Python实现base64字符串与图片互转的详细步骤

《使用Python实现base64字符串与图片互转的详细步骤》要将一个Base64编码的字符串转换为图片文件并保存下来,可以使用Python的base64模块来实现,这一过程包括解码Base64字符串... 目录1. 图片编码为 Base64 字符串2. Base64 字符串解码为图片文件3. 示例使用注意

java连接opcua的常见问题及解决方法

《java连接opcua的常见问题及解决方法》本文将使用EclipseMilo作为示例库,演示如何在Java中使用匿名、用户名密码以及证书加密三种方式连接到OPCUA服务器,若需要使用其他SDK,原理... 目录一、前言二、准备工作三、匿名方式连接3.1 匿名方式简介3.2 示例代码四、用户名密码方式连接4

MySQL 表的内外连接案例详解

《MySQL表的内外连接案例详解》本文给大家介绍MySQL表的内外连接,结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录表的内外连接(重点)内连接外连接表的内外连接(重点)内连接内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我