Leetcode 2788 按分隔符拆分字符串
2788.按分隔符拆分字符串
给你一个字符串数组 words
和一个字符 separator
,请你按 separator
拆分 words
中的每个字符串。
返回一个由拆分后的新字符串组成的字符串数组,不包括空字符串 。
注意
separator
用于决定拆分发生的位置,但它不包含在结果字符串中。- 拆分可能形成两个以上的字符串。
- 结果字符串必须保持初始相同的先后顺序。
示例 1:
输入: words = [“one.two.three”,“four.five”,“six”], separator = “.”
输出: [“one”,“two”,“three”,“four”,“five”,“six”]
解释: 在本示例中,我们进行下述拆分:
“one.two.three” 拆分为 “one”, “two”,
“three” “four.five” 拆分为 “four”,
“five” “six” 拆分为 “six”
因此,结果数组为 [“one”,“two”,“three”,“four”,“five”,“six”] 。
示例 2:
输入: words = ["$easy$","$problem$"], separator = “$”
输出: [“easy”,“problem”]
解释: 在本示例中,我们进行下述拆分:
“$easy$” 拆分为 “easy”(不包括空字符串)
“$problem$” 拆分为 “problem”(不包括空字符串)
因此,结果数组为 [“easy”,“problem”] 。
示例 3:
输入: words = ["|||"], separator = “|”
输出: []
解释: 在本示例中,"|||" 的拆分结果将只包含一些空字符串,所以我们返回一个空数组 [] 。
提示:
1 <= words.length <= 100
1 <= words[i].length <= 20
words[i]
中的字符要么是小写英文字母,要么就是字符串".,|$#@"
中的字符(不包括引号)separator
是字符串".,|$#@"
中的某个字符(不包括引号)
Related Topics
- 数组
- 字符串
题目链接: link
解答
本题的难度是 Easy.
我选择了最直观的方法, 就看当前是不是分隔符, 如果不是分隔符就把当前字符放到StringBuilder里(我一开始想要放到 Stack 里再放到 StringBuilder 里, 感觉自己真的是太抽象了), 然后如果是分隔符就把 StringBuilder 转为字符串然后丢到结果 List 里, 当然此时要求 StringBuilder 里不为空.
代码如下:
class Solution {
public List<String> splitWordsBySeparator(List<String> words, char separator) {
List<String> result = new ArrayList<>();
String s;
StringBuilder sb = new StringBuilder();
char c;
for (int i = 0; i < words.size(); i++) {
s = words.get(i);
sb.setLength(0);
for (int j = 0; j < s.length(); j++) {
c = s.charAt(j);
if (c == separator ){
if (sb.length()==0){continue;}
result.add(sb.toString());
sb.setLength(0);
} else {
sb.append(c);
}
}
if (sb.length()>0){
result.add(sb.toString());
}
}
return result;
}
}
这样就能一遍过了, 但是还是需要5ms, 这里要多次往 StringBuilder 里面 append, 然后再 toString, 这里可能比较耗时, 因此可以直接用 substring 从字符串中获取.
class Solution {
public List<String> splitWordsBySeparator(List<String> words, char separator) {
List<String> result = new ArrayList<>();
for (String word : words) {
for (int i = 0; i < word.length(); i++) {
if (word.charAt(i) != separator) {
int start = i;
while (i < word.length() && word.charAt(i) != separator) {
i++;
}
result.add(word.substring(start, i));
}
}
}
return result;
}
}
这样就能从第一个不是分隔符的字符开始, 然后找下一个分割字符或者直到字符串结束.