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

相关文章

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

Mac电脑如何通过 IntelliJ IDEA 远程连接 MySQL

《Mac电脑如何通过IntelliJIDEA远程连接MySQL》本文详解Mac通过IntelliJIDEA远程连接MySQL的步骤,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友跟... 目录MAC电脑通过 IntelliJ IDEA 远程连接 mysql 的详细教程一、前缀条件确认二、打开 ID

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

Python 字符串裁切与提取全面且实用的解决方案

《Python字符串裁切与提取全面且实用的解决方案》本文梳理了Python字符串处理方法,涵盖基础切片、split/partition分割、正则匹配及结构化数据解析(如BeautifulSoup、j... 目录python 字符串裁切与提取的完整指南 基础切片方法1. 使用切片操作符[start:end]2

python连接sqlite3简单用法完整例子

《python连接sqlite3简单用法完整例子》SQLite3是一个内置的Python模块,可以通过Python的标准库轻松地使用,无需进行额外安装和配置,:本文主要介绍python连接sqli... 目录1. 连接到数据库2. 创建游标对象3. 创建表4. 插入数据5. 查询数据6. 更新数据7. 删除

MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)

《MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)》本文给大家介绍MyBatis的xml中字符串类型判空与非字符串类型判空处理方式,本文给大家介绍的非常详细,对大家的学习或... 目录完整 Hutool 写法版本对比优化为什么status变成Long?为什么 price 没事?怎