一道简单的分词程序

aliate · 2017-09-29 04:50:15 · 1240 次点击 · 预计阅读时间 2 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2017-09-29 04:50:15 的文章,其中的信息可能已经有所发展或是发生改变。

题目:

给出字符串dogandcat及字典{"do", "d", "gand", "g", "and", "dog", "cat", "c", "at", "in", "play", "i", "nplay"}, 找出组成字符串的所以可能的单词组合。

之前用haskell写过一个实现,但接触golang之后,发现可以写成更简明的版本,代码如下:

package main

import (
    "fmt"
)

var word = "dogandcat"
var dicts = []string{"do", "d", "gand", "g", "and", "dog", "cat", "c", "at", "in", "play", "i", "nplay"}
var results = [][]string{}

var cpyCounter = 0
var stepCounter = 0

func IsContainsInDicts(str string) bool {
    for _, v := range dicts {
        if v == str {
            return true
        }
    }
    return false
}

func breaker(matched []string, pos int) {
    if pos >= len(word) {
        results = append(results, matched)
        return
    }
    match := []byte{}
    for i := pos; i < len(word); i++ {
        match = append(match, word[i])
        aword := string(match)
        stepCounter += 1
        if IsContainsInDicts(aword) {
            cpyMatched := make([]string, len(matched))
            copy(cpyMatched, matched)
            cpyMatched = append(cpyMatched, aword)
            cpyCounter += 1
            breaker(cpyMatched, i+1)
        }
    }
}

func main() {
    fmt.Println(word)
    fmt.Println(dicts)

    breaker([]string{}, 0)

    fmt.Println()
    fmt.Println(results)

    fmt.Println()
    fmt.Println("step times: ", stepCounter)
    fmt.Println("cpy times: ", cpyCounter)
}

以上代码还有点性能上的小问题:

  • 1)如果字典很大,IsContainsInDicts的效率就很低;
  • 2)如果字符串很大,result很耗内存;

如果有更好的方法,欢迎指教,谢谢!


有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1240 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传