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;
    }
}

这样就能从第一个不是分隔符的字符开始, 然后找下一个分割字符或者直到字符串结束.