惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Y
Y Combinator Blog
The GitHub Blog
The GitHub Blog
Vercel News
Vercel News
D
DataBreaches.Net
MongoDB | Blog
MongoDB | Blog
H
Help Net Security
小众软件
小众软件
美团技术团队
T
The Blog of Author Tim Ferriss
爱范儿
爱范儿
D
Docker
Martin Fowler
Martin Fowler
大猫的无限游戏
大猫的无限游戏
博客园 - 聂微东
Blog — PlanetScale
Blog — PlanetScale
H
Hackread – Cybersecurity News, Data Breaches, AI and More
罗磊的独立博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
V2EX
S
SegmentFault 最新的问题
云风的 BLOG
云风的 BLOG
B
Blog
雷峰网
雷峰网
The Cloudflare Blog

博客园 - Fanny123

LeetCode最大数字范围的整数之和 LeetCode统计好子数组 LeetCode边界与内部和相等的稳定子数组 三段式数组II 变为活跃状态的最小时间 平衡装运的最大数量 三段式数组 I 相邻字符串之间的最长公共前缀 找出数组中的所有 K 近邻下标 使叶子路径成本相等的最小增量 硬币面值还原 检查元素频次是否为质数 等积子集的划分方案 统计一个数组中好对子的数目 LeetCode 1482. 制作 m 束花所需的最少天数 C# 基础(更新中) 圆形靶内的最大飞镖数量 丑数 验证栈序列 BST的中序后继
分割字符串
Fanny123 · 2025-06-29 · via 博客园 - Fanny123

分割字符串

Leetcode 第456场周赛

题目

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

从下标 0 开始构建一个段。
逐字符扩展当前段,直到该段之前未曾出现过。
只要当前段是唯一的,就将其加入段列表,标记为已经出现过,并从下一个下标开始构建新的段。
重复上述步骤,直到处理完整个字符串 s。
返回字符串数组 segments,其中 segments[i] 表示创建的第 i 段。©leetcode

示例 1:
输入: s = "abbccccd"
输出: ["a","b","bc","c","cc","d"]

解释:
下标 添加后的段 已经出现过的段 当前段是否已经出现过? 新段 更新后已经出现过的段
0 "a" [] 否 "" ["a"]
1 "b" ["a"] 否 "" ["a", "b"]
2 "b" ["a", "b"] 是 "b" ["a", "b"]
3 "bc" ["a", "b"] 否 "" ["a", "b", "bc"]
4 "c" ["a", "b", "bc"] 否 "" ["a", "b", "bc", "c"]
5 "c" ["a", "b", "bc", "c"] 是 "c" ["a", "b", "bc", "c"]
6 "cc" ["a", "b", "bc", "c"] 否 "" ["a", "b", "bc", "c", "cc"]
7 "d" ["a", "b", "bc", "c", "cc"] 否 "" ["a", "b", "bc", "c", "cc", "d"]
因此,最终输出为 ["a", "b", "bc", "c", "cc", "d"]。

示例 2:
输入: s = "aaaa"
输出: ["a","aa"]
解释:
下标 添加后的段 已经出现过的段 当前段是否已经出现过? 新段 更新后已经出现过的段
0 "a" [] 否 "" ["a"]
1 "a" ["a"] 是 "a" ["a"]
2 "aa" ["a"] 否 "" ["a", "aa"]
3 "a" ["a", "aa"] 是 "a" ["a", "aa"]
因此,最终输出为 ["a", "aa"]。

提示:
1 <= s.length <= 105
s 仅包含小写英文字母。©leetcode

解答

实现上相对简单,根据题目描述遍历即可。
把当前char加入cur字符串,如果cur之前出现过,则i向前遍历;直到cur没出现过,把cur加入结果和一个用于记录是否出现过的hashset。

实现细节上:

  1. cur用stringbuilder而不是用string,这样做append性能高一点,用setLength 0 来清空它。
  2. 最后可能出现到n了,但是还是之前出现过,这时候不需要加入结果。比如例子中的数组aaaa,当遍历到n时,cur是aa,是之前出现过的string。
class Solution {
    public List<String> partitionString(String s) {
        List<String> res=new ArrayList<>();
        HashSet<String> prevs=new HashSet<>();
        char[] arr=s.toCharArray();
        int n=arr.length;
        int i=0;
        StringBuilder cur=new StringBuilder();
        while(i<n){
            cur.append(arr[i]);
            while(i<n-1&&prevs.contains(cur.toString())){
                i++;
                cur.append(arr[i]);
            }
            i++;

            String tmp=cur.toString();
            //to n, still show before, break
            if(prevs.contains(tmp)){
                break;
            }
            prevs.add(tmp);
            res.add(tmp);
            cur.setLength(0);
        }

        return res;
    }
}©leetcode