Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- func findTag(str: String, tags: [String: String]) -> String{
- var res = ""
- let trie = Trie()
- for tag in tags.keys{
- trie.addWord(tag)
- }
- var i = 0
- var arr = Array(str)
- while i < arr.count {
- if trie.hasPrefix(String(arr[i]).lowercased()){
- var j = i
- while j < arr.count{
- if !trie.hasPrefix(String(arr[i ... j]).lowercased()){
- res.append(arr[i])
- i += 1
- break
- }
- if trie.hasWord(String(arr[i ... j]).lowercased()){
- res.append("[\(String(arr[i ... j])) : \(tags[String(arr[i ... j]).lowercased()]!)]")
- //arr.replaceSubrange(Range(NSMakeRange(i, j - i))!, with: tags[String(arr[i ... j])]!)
- i = j + 1
- break
- }
- j += 1
- }
- }else{
- res.append(arr[i])
- i += 1
- }
- }
- return res
- }
- class Trie {
- var root = Node()
- func addWord( _ str: String){
- var runner = root
- for char in str{
- if let childN = runner.child[char]{
- runner = childN
- }else{
- runner.child[char] = Node()
- runner = runner.child[char]!
- }
- }
- runner.hasWord = true
- }
- func hasPrefix(_ pre: String) -> Bool{
- var runner = root
- for char in pre{
- if let childN = runner.child[char]{
- runner = childN
- }else{
- return false
- }
- }
- return true
- }
- func hasWord(_ word : String) -> Bool{
- var runner = root
- for char in word{
- if let childN = runner.child[char]{
- runner = childN
- }else{
- return false
- }
- }
- return runner.hasWord
- }
- }
- class Node{
- var child = [Character : Node]()
- var hasWord = false
- }
- let tag = ["airbnb": "business", "san francisco": "city"]
- let str = "I visited San Francisco for work and stayed at Airbnb. I really loved the city and the home where I stayed."
- let res = findTag(str: str, tags: tag)
- print(res)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement