按分隔符拆分字符串(力扣)
给你一个字符串数组 words 和一个字符 separator ,请你按 separator 拆分 words 中的每个字符串。
返回一个由拆分后的新字符串组成的字符串数组,不包括空字符串 。
注意
separator 用于决定拆分发生的位置,但它不包含在结果字符串中。
拆分可能形成两个以上的字符串。
结果字符串必须保持初始相同的先后顺序。
提示:
1 <= words.length <= 100
1 <= words[i].length <= 20
words[i] 中的字符要么是小写英文字母,
要么就是字符串 ".,|$#@" 中的字符(不包括引号)
separator 是字符串 ".,|$#@" 中的某个字符(不包括引号)
方式一:使用函数
思路
可以使用split()函数来根据指定的分隔符将字符串拆分为字符串数组,但是记得给一些字符进行转义。如果是空串的话,则不加入答案列表中。
public String[] split(String regex)
测试代码
class Solution {
public List<String> splitWordsBySeparator(List<String> words, char separator) {
List<String> ans=new ArrayList<>();
String regex=null;
//[.,|$#@]
//有些字符需要转义,有些就不需要
switch (separator){
case '.':regex="\\.";
break;
case ',':regex=",";
break;
case '|':regex="\\|";
break;
case '$':regex="\\$";
break;
case '#' :regex="#";
break;
case '@':regex="@";
break;
};
for (String s:words) {
//通过split函数来处理
String[] parts = s.split(regex);
for (String s2:parts) {
//为空的情况,不添加
if (s2.equals(""))continue;
ans.add(s2);
}
}
return ans;
}
}
复杂度
时间复杂度:可以近似看作O(n*m)。n是字符串列表中字符串的数量,m是每个字符串的平均长度。
空间复杂度:可以看作O(n),其中n是输入字符串列表的总长度。
运行结果
方式二:模拟
思路
我们遍历每一个字符串,通过substring截取一个字母然后来比较,我们需要维护两个指针,left和right初始为0,他们两个的中间就是一个一个拆分的答案,相等的时候我们更新指针right,并截取答案字符串,判断是否为空,不为则添加,然后把右指针的值赋值给left,继续遍历直到下一个分隔符。
还没有完,存在漏掉的情况,比如说:"one.two.three"这个字符串,当索引走到最后时right的值还在7,没有更新,所以判断 if (right<s.length()&&right!=0)。
还有漏掉的right如果等于0情况,如果left也为0,说明没有走,如果left>0说明是这种情况:
words =[“#,”],separator =“#”
所以直接返回substring(left)即可
以上都不满足,说明没有分隔符,属于没走,直接添加即可,记得每次添加的时候都要判断是否为空。
测试代码
class Solution{
public List<String> splitWordsBySeparator(List<String> words, char separator) {
List<String> ans=new ArrayList<>();
int left=0;
int right=0;
for (String s:words) {
for (int i = 0; i <s.length(); i++) {
//当前字符串的单个字是否与分隔符相等
if (s.substring(i,i+1).equals(String.valueOf(separator))){
right=i;
String ss=s.substring(left, right);
if (!ss.equals("")) ans.add(ss);
left=right+1;
}
}
//当最后一个字符串右边点没更新的时候
if (right<s.length()&&right!=0){
String s2=s.substring(right+1);
if (!s2.equals("")) ans.add(s2);
}else if(left>right){
//当索引为0就出现分隔符的时候
String s2= s.substring(left);
if (!s2.equals("")) ans.add(s2);
}
else ans.add(s);
right=0;left=0;
}
return ans;
}
}
复杂度
时间复杂度为O(m* n)。
空间复杂度为O(m)。