给你一个字符串 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)。