Skip to content

Instantly share code, notes, and snippets.

@lynxerzhang
Last active August 29, 2015 14:07
Show Gist options
  • Save lynxerzhang/e11685cacfcd2cdae7c8 to your computer and use it in GitHub Desktop.
Save lynxerzhang/e11685cacfcd2cdae7c8 to your computer and use it in GitHub Desktop.
the trie data structure write in swift
import Foundation
"use xcode's playground"
/**
* port as3 to swift
* http://www.anotherearlymorning.com/2009/06/trie-data-structure-in-actionscript-3/
* http://www.emanueleferonato.com/2009/07/13/trie-data-structure-in-actionscript-3/
*
*/
class Trie
{
private var letters = [Character:TrieData]()
func get(jumble:String)->[String]
{
var result:[String] = []
var s:Character = jumble[advance(jumble.startIndex, 0)]
if let d = letters[s] {
getRecursivelyFor(jumble, charIndex: 1, withData: d, result: &result)
}
return result
}
func add(word:String)
{
var s = word[advance(word.startIndex, 0)]
var d = letters[s]
if d == nil {
d = TrieData()
letters[s] = d
}
addRecursivelyFor(word, charIndex: 1, withData: d!)
}
private func addRecursivelyFor(word:String, var charIndex:Int, withData:TrieData)
{
var len = countElements(word)
if charIndex == len {
return
}
var s:Character = word[advance(word.startIndex, charIndex)]
var d = withData.children[s]
if d == nil {
d = TrieData()
withData.children[s] = d
}
if charIndex == len - 1 {
d!.isWord = true
}
else{
addRecursivelyFor(word, charIndex: ++charIndex, withData: d!)
}
}
private func getRecursivelyFor(word:String, var charIndex:Int, withData:TrieData, inout result:[String])
{
var count = countElements(word)
if count == charIndex {
return
}
var s:Character = word[advance(word.startIndex, charIndex)]
if let c = withData.children[s]{
if c.isWord {
var findWord = word.substringWithRange(Range<String.Index>(start:advance(word.startIndex, 0),
end:advance(word.startIndex, charIndex + 1)))
result.append(findWord)
}
getRecursivelyFor(word, charIndex:++charIndex, withData: c, result: &result)
}
}
}
class TrieData
{
var isWord = false
var children = [Character:TrieData]()
}
//example
var trie = Trie();
trie.add("program");
trie.add("programming");
var result = trie.get("programming");
println(result); //[program, programming]
@lynxerzhang
Copy link
Author

1.在swift中数组是数值类型, 是传值的, 所以在方法的声明中, 使用了inout修饰符, 也可以不使用, 修改完直接return回给调用方
2.类方法的第二个参数开始默认都有一个external name, 在调用时需要填写。
3.字符串截取所需参数不是Int 类型的, 而是String.Index类型, advance为全局函数。
4.swift中除了字符串类型, 还有字符类型。对于单个字符的字面值, swift推导类型默认为String, 所以如果需要字符型, 需要自己指定。
5.使用optional binding将optional内部值存储至某变量。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment