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

推荐订阅源

U
Unit 42
Vercel News
Vercel News
博客园 - 叶小钗
大猫的无限游戏
大猫的无限游戏
MyScale Blog
MyScale Blog
P
Proofpoint News Feed
量子位
Engineering at Meta
Engineering at Meta
B
Blog RSS Feed
博客园 - 【当耐特】
Recent Announcements
Recent Announcements
Google DeepMind News
Google DeepMind News
D
DataBreaches.Net
Stack Overflow Blog
Stack Overflow Blog
博客园 - 聂微东
小众软件
小众软件
Hugging Face - Blog
Hugging Face - Blog
人人都是产品经理
人人都是产品经理
IT之家
IT之家
T
The Blog of Author Tim Ferriss
Last Week in AI
Last Week in AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Jina AI
Jina AI
博客园 - 三生石上(FineUI控件)

博客园 - 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