笔试遇到了这题, 慌慌张张没搞出来; 记录一下,实际思路还是比较简单的。
不使用编程语言自带的 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 次字符比较。

Comments NOTHING