分割字符串
分割字符串
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。
实现细节上:
- cur用stringbuilder而不是用string,这样做append性能高一点,用setLength 0 来清空它。
- 最后可能出现到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

浙公网安备 33010602011771号