LeetCode 3597.分割字符串

给你一个字符串 s,按照以下步骤将其分割为 互不相同的段 :

从下标 0 开始构建一个段。

逐字符扩展当前段,直到该段之前未曾出现过。

只要当前段是唯一的,就将其加入段列表,标记为已经出现过,并从下一个下标开始构建新的段。

重复上述步骤,直到处理完整个字符串 s。

返回字符串数组 segments,其中 segmentsi 表示创建的第 i 段。

示例 1:

输入: s = "abbccccd"

输出: "a","b","bc","c","cc","d"

解释:

因此,最终输出为 "a", "b", "bc", "c", "cc", "d"。

示例 2:

输入: s = "aaaa"

输出: "a","aa"

解释:

因此,最终输出为 "a", "aa"。

提示:

1 <= s.length <= 10 5 ^5 5

s 仅包含小写英文字母。

我们可以使用字典树,如果在字典树中没有发现重复的段,就将该段加入结果数组:

cpp 复制代码
struct Node {
    vector<Node *> next = vector<Node *>(26, nullptr);
};

class Solution {
public:
    vector<string> partitionString(string s) {
        vector<string> ans;
        Node *root = new Node;

        string curStr;
        Node *curNode = root;
        for (char c : s) {
            curStr += c;

            // 如果当前段没有重复
            if (curNode->next[c - 'a'] == nullptr) {
                curNode->next[c - 'a'] = new Node;

                ans.push_back(curStr);

                curStr = "";
                curNode = root;
            } else {
                curNode = curNode->next[c - 'a'];
            }
        }

        return ans;
    }
};

时间复杂度:O(n) 或 O(n∣Σ∣),其中 n 是 s 的长度,∣Σ∣=26 是字符集合的大小。Node中用哈希表而不是固定大小的vector实现可以做到 O(n)。

空间复杂度:O(n) 或 O(n∣Σ∣)。Node中用哈希表而不是固定大小的vector实现可以做到 O(n)。

相关推荐
用户9799848071811 小时前
200 行代码写一个能跑的 AI Agent:不依赖任何框架,只靠 tool-calling 原理
算法
threerocks12 小时前
【Muse实战】X 流量作战室搭建保姆级教程 - 拥有你自己的运营团队
算法
GreenTea12 小时前
深度拆解 ScienceBuddy:如何用“双层递归自进化”构建高可靠科研 Agent Harness
前端·后端·算法
花椒技术12 小时前
2.46 秒生成 5 秒视频:拆解 H3 Max 的模型、推理栈与硬件协同
算法·音视频开发·视频编码
vivo互联网技术12 小时前
ART:妆容迁移框架,重新定义高保真妆容迁移 | ECCV 2026
人工智能·算法·图像识别
用户04414409244912 小时前
卫星信号模拟器里的四个坐标转换公式
算法
橘和柠12 小时前
阿里 open-code-review (AI代码审查工具)实战:安装、四层规则链、自定义规则格式与实测避坑
算法·面试
得物技术12 小时前
别再只卷向量检索了,得物交易搜索如何用“生成式”实现召回范式跃迁?
人工智能·算法·llm
罗西的思考12 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 ---(4)--- Rollout实现细节
人工智能·算法
罗西的思考12 小时前
机器人 / 物理 Agent Harness 综合分析与对比:从「更强的模型」到「更好的系统」
人工智能·算法·机器学习