字符串分割的实现
最近看书时,突然想到,字符串分割应该很简单,毕竟是常用的函数,如果不使用语言提供的原生方法,怎么实现字符串的分割?
发现坑也有几个,直接码代码吧,简单的用go语言实现了一下。
1 func split(str , seg string) []string { 2 st := []rune(str) 3 sr := []rune(seg) 4 L := make([]int,len(st)/2+1) //起始位置索引 5 R := make([]int,len(st)/2+1) //结束位置索引 6 7 n:=0//分割计数 8 a:=0//上一次的位置 9 for i:=0; i <= len(st)-len(sr); i++ {//注意长度 10 b := true 11 12 for j:=0 ; j < len(sr); j++ { 13 if st[i+j]!=sr[j]{ 14 b=false 15 break 16 } 17 } 18 if b{ 19 L[n]=a 20 R[n]=i 21 a=i+len(sr) 22 i=a 23 n++ 24 } 25 } 26 var ss []string 27 if n!=0{ 28 L[n]=a //注意:可分割时,不要忘了最末尾的那一个 29 R[n]=len(st) 30 ss = make([]string,n+1) 31 for i := 0; i <= n; i++ { 32 x := L[i] 33 y := R[i] 34 ss[i] = string(st[x:y]) 35 } 36 return ss 37 } 38 ss = make([]string,1) //不能分割的话,也应该返回 39 ss[0] = str 40 return ss 41 }
上面的示例有许多性能优化空间,主要是减少内存分配次数。用了个Count啊,⊙︿⊙
func GenSplit(str, seg string) []string { c := strings.Count(str, seg) if c == 0 { ss := make([]string, 1) ss[0] = str return ss } ss := make([]string, c+1) strLen := len(str) segLen := len(seg) a := 0 //上一次的位置 n := 0 // for i := 0; i <= strLen-segLen; i++ { if str[i] != seg[0] { continue } b := true for j := 0; j < segLen; j++ { if str[i+j] != seg[j] { b = false break } } if b { ss[n] = str[a:i] a = i + segLen i = a n++ } } ss[n] = str[a:] return ss }
和golang原生的方法比较了下,还是有点差距,看来golang的性能,真的是够浪的。