LeetCode 3597.分割字符串

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

从下标 0 开始构建一个段。
逐字符扩展当前段,直到该段之前未曾出现过。
只要当前段是唯一的,就将其加入段列表,标记为已经出现过,并从下一个下标开始构建新的段。
重复上述步骤,直到处理完整个字符串 s。
返回字符串数组 segments,其中 segments[i] 表示创建的第 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 <= 105^55
s 仅包含小写英文字母。

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

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)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值