分割字符串

分割字符串

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
posted @ 2025-06-29 16:12  Fanny123  阅读(244)  评论(0)    收藏  举报