주어진 문제 설명에 따라 문자열을 스캔하면서 현재 사전에 등록된 가장 긴 문자열이 무엇인지 찾는다. 이때 주의해야 할 점은 '등록된 문자열'이란 곧 현재 입력 문자열로 시작하는 문자 중 가장 긴 길이라는 점이다. 또한 현재 문자열에서 시작, 길이가 긴 문자열을 찾았다면 다음 입력값에서 자연스럽게 제외되기 때문에 인덱스를 오프셋으로 카운팅했다.
import Foundation
func solution(_ msg:String) -> [Int] {
var wordDict = initWordDict()
var result = [Int]()
let letters = Array(msg).map{String($0)}
func getZip() {
var curOffset = -1
for idx in 0..<letters.count {
if curOffset >= idx {
continue
}
var length = 1
var word = ""
for curLength in 1...letters.count-idx {
let curWord = letters[idx..<idx+curLength].joined()
if wordDict[curWord] == nil {
break
} else {
length = curLength
word = curWord
}
}
curOffset = idx + length - 1
result.append(wordDict[word]!)
if idx + length < letters.count {
let newWord = word + letters[idx+length]
wordDict[newWord] = wordDict.count + 1
}
}
}
getZip()
return result
}
func initWordDict() -> [String: Int] {
let alphabets = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
var wordDict = [String:Int]()
var letterIndex = 1
for letter in alphabets {
let letter = String(letter)
wordDict[letter] = letterIndex
letterIndex += 1
}
return wordDict
}