zoukankan      html  css  js  c++  java
  • 字符串分割的实现

    最近看书时,突然想到,字符串分割应该很简单,毕竟是常用的函数,如果不使用语言提供的原生方法,怎么实现字符串的分割?

    发现坑也有几个,直接码代码吧,简单的用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的性能,真的是够浪的。

  • 相关阅读:
    Postman之token动态获取
    AJAX省市县三级联动的实现
    Javamail简单使用案例
    JavaWeb之JSP入门
    js小例子之二级联动
    git常用命令
    centos下安装pip-python
    Pyspider抓取静态页面
    Python中__init__()方法注意点
    2、Pyspider使用入门
  • 原文地址:https://www.cnblogs.com/ShengunErshu/p/12514554.html
Copyright © 2011-2022 走看看