Leetcode.1593 拆分字符串使唯一子字符串的数目最大

news/2024/7/20 22:44:37 标签: 深度优先, leetcode, 算法, 回溯

题目链接

Leetcode.1593 拆分字符串使唯一子字符串的数目最大 Rating : 1740

题目描述

给你一个字符串 s,请你拆分该字符串,并返回拆分后唯一子字符串的最大数目。

字符串 s拆分后可以得到若干 非空子字符串 ,这些子字符串连接后应当能够还原为原字符串。但是拆分出来的每个子字符串都必须是 唯一的

注意:子字符串 是字符串中的一个连续字符序列。

示例 1:

输入:s = “ababccc”
输出:5
解释:一种最大拆分方法为 [‘a’, ‘b’, ‘ab’, ‘c’, ‘cc’] 。像 [‘a’, ‘b’, ‘a’, ‘b’, ‘c’, ‘cc’] 这样拆分不满足题目要求,因为其中的 ‘a’ 和 ‘b’ 都出现了不止一次。

示例 2:

输入:s = “aba”
输出:2
解释:一种最大拆分方法为 [‘a’, ‘ba’] 。

示例 3:

输入:s = “aa”
输出:1
解释:无法进一步拆分字符串。

提示:

  • 1 < = s . l e n g t h < = 16 1 <= s.length <= 16 1<=s.length<=16

  • s仅包含小写英文字母

解法:哈希表 + 回溯

由于本题数据量非常小,我们可以通过 回溯 求出所有分割字符串的方案。

回溯过程中用一个 哈希表 uset记录已经被分割的子串。

如果 uset中已经存在当前被分割的子串 tt就不符合要求,将 t包含下一个字符,再做同样的操作。

枚举子串的起始下标 u,如果 u >= s.size(),说明已经分割完一个方案了,uset.size()就是当前分割方案的答案。

我们用一个全局变量 ans记录最大值。

剪枝:

如果 n - u + uset.size() <= ans,就直接返回。这个式子的意义是,当前已经被分割好的唯一子串数量 uset.size()+ 剩下未被分割的最大可能子串数量 都小于等于 ans。说明就是递归到最后,ans也不会变得更大,所以这是无用的操作,可以直接返回。

时间复杂度: O ( 2 n ∗ n ) O(2^n * n) O(2nn)

C++代码:

class Solution {
public:
    int ans = 0,n;

    void dfs(int u,string &s,unordered_set<string> &uset){
        if(n - u + uset.size() <= ans) return;
        if(u == n){
            int m = uset.size();
            ans = max(ans,m);
            return;
        }
        for(int i = u;i < n;i++){
            string t = s.substr(u,i - u + 1);
            if(uset.count(t)) continue;
            uset.insert(t);
            dfs(i + 1,s,uset);
            uset.erase(t);
        }
    }

    int maxUniqueSplit(string s) {
        unordered_set<string> uset;
        n = s.size();
        dfs(0,s,uset);
        return ans;
    }
};


http://www.niftyadmin.cn/n/170126.html

相关文章

【面试题】浅谈css加载是否会造成阻塞

大厂面试题分享 面试题库前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★地址&#xff1a;前端面试题库示例话不多说先看代码&#xff1a;<!DOCTYPE html><htmllang"en"><head><title>css阻塞</title>&l…

如何做好品牌营销,这些重点带你“破局”

一个品牌从最初诞生时的“默默无闻”&#xff0c;到拥有深远的市场认知度&#xff0c;离不开营销的发力&#xff0c;可以说贯穿着品牌的整个生命周期。今天就来跟大家分享下&#xff0c;在品牌发展的各个阶段如何做好品牌营销&#xff1f;一、品牌的生命周期品牌的诞生与一个生…

linux系统运维面试题大全(137道题)

linux系统运维面试题大全 1、 如何看当前Linux系统有几颗物理CPU和每颗CPU的核数&#xff1f; 查看物理cup&#xff1a; cat /proc/cpuinfo|grep -c ‘physical id’ 查看每颗cup核数 cat /proc/cpuinfo|grep -c ‘processor’ 2、查看系统负载有两个常用的命令&#xff0c;…

Postman pre-request script

在pre-request Script中执行登录获取token1.问题是什么执行接口需要每次执行登录&#xff0c;然后带入登录的token,需要复制比较麻烦2.怎么解决把每次请求发送之前先发送登录请求&#xff0c;然后把登录的token设置到环境变量&#xff0c;最后再把取环境变量的值token具体代码如…

Android面试题以及答案2023

什么是Android架构?列出各个层次的组件并简要解释其作用。答:Android架构是指Android系统的层次化结构,包含以下四个层次的组件: 应用层:包含用户应用程序,由开发者编写和安装在设备上,运行于Android操作系统之上。应用框架层:为应用程序提供了许多API和类库,包括各种…

DRBG_InstantiateSeeded调试-1

public 参数解析: standardEKPolicy: 837197674484b3f81a90cc8d46a5d724fd52d76e06520b64f2a1da1b331469aa(32bytes) rawCmdBuf 命令数据: 800200000063000001314000000100000009400000090000010000000400000000003a0001000b000300720020837197674484b3f81a90cc8d46a5d724fd5…

Python集合

Python集合&#xff08;set&#xff09;是一种无序且不重复的数据结构&#xff0c;通过使用大括号 {} 或 set() 函数创建。在Python中集合可以用于数学运算&#xff0c;如并集、交集和差集等。 创建集合 在Python中&#xff0c;我们可以使用大括号 {} 或 set() 函数来创建集合…

[前端] 虚拟列表的实现

为什么 前端一次性展示很多数据的时候因为回流和重绘会带来比较大的性能问题&#xff0c;因此需要一种方法减少渲染的性能开销。 假设后端返回 1000 条数据&#xff0c;前端一次性展示出来&#xff0c;可能用户只想看到前 100 条&#xff0c;那么剩下 90% 的数据就没必要展示了…