笔试遇到了这题, 慌慌张张没搞出来; 记录一下,实际思路还是比较简单的。

不使用编程语言自带的 split函数, 完成字符串分割操作

例: 输入: "ab&&ac", 分隔符为 "&&"。分割后结果为 ["ab", "ac"]

/**
     * 字符串分割, 不使用原生 split 方法
     * "abc,,de,,fgh", ",," -> ["abc", "de", "fgh"]
     * 分隔符可能为多位不规则字符串
     * @param str
     * @param delimiter
     * @return
     */
    @Override
    List splitString(String str, String delimiter) {
        int len = str.length();
        int delimiterLen = delimiter.length();
        List result = new ArrayList<>();
        int start = 0;

        // 可以使用startWith(delimiter, i)替换 遍历检查
        for (int i = 0; i < len; i++) {
            boolean isDelimiter = true;
            for (int j = 0; j < delimiterLen; j++) {
                if(str.charAt(i + j) != delimiter.charAt(j)) {
                    isDelimiter = false;
                    break;
                }
            }
            if (isDelimiter) {
                result.add(str.substring(start, i));
                i += delimiterLen - 1;
                start = i + 1;
            }
        }

        result.add(str.substring(start));
        return result;
    }

做的时候没注意到分隔符可以有多位 (′⌒`) 狠狠长记性了。

上面这段代码的时间复杂度为 O(strLen * delimiterLen )。外层循环遍历字符串 str 的每一个可能的起始位置,最多遍历strLen−delimiterLen+1 次(即 i 从 0 到 len - delimiterLen)。
内层循环用于比较从位置 i 开始的子串与分隔符 delimiter 是否相等,每次比较最多需要进行 delimiterLen 次字符比较。