[Swift]LeetCode820. 单词的压缩编码 | Short Encoding of Words
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址: https://www.cnblogs.com/strengthen/p/10601421.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
Given a list of words, we may encode it by writing a reference string S
and a list of indexes A
.
For example, if the list of words is ["time", "me", "bell"]
, we can write it as S = "time#bell#"
and indexes = [0, 2, 5]
.
Then for each index, we will recover the word by reading from the reference string from that index until we reach a "#"
character.
What is the length of the shortest reference string S possible that encodes the given words?
Example:
["time", "me", "bell"]
"time#bell#" and indexes = [0, 2, 5
Note:
1 <= words.length <= 2000
.1 <= words[i].length <= 7
.- Each word has only lowercase letters.
给定一个单词列表,我们将这个列表编码成一个索引字符串 S
与一个索引列表 A
。
例如,如果这个列表是 ["time", "me", "bell"]
,我们就可以将其表示为 S = "time#bell#"
和 indexes = [0, 2, 5]
。
对于每一个索引,我们可以通过从字符串 S
中索引的位置开始读取字符串,直到 "#" 结束,来恢复我们之前的单词列表。
那么成功对给定单词列表进行编码的最小字符串长度是多少呢?
示例:
["time", "me", "bell"]
"time#bell#" , indexes = [0, 2, 5
提示:
1 <= words.length <= 2000
1 <= words[i].length <= 7
- 每个单词都是小写字母 。
1 class Solution { 2 func minimumLengthEncoding(_ words: [String]) -> Int { 3 var res:Int = 0 4 var st:Set<String> = Set<String>(words) 5 for word in st 6 { 7 for i in 1..<word.count 8 { 9 st.remove(word.subString(i)) 10 } 11 } 12 for word in st 13 { 14 res += word.count + 1 15 } 16 return res 17 } 18 } 19 20 extension String { 21 // 截取字符串:从index到结束处 22 // - Parameter index: 开始索引 23 // - Returns: 子字符串 24 func subString(_ index: Int) -> String { 25 let theIndex = self.index(self.endIndex, offsetBy: index - self.count) 26 return String(self[theIndex..<endIndex]) 27 } 28 }
344ms
1 class Solution { 2 func minimumLengthEncoding(_ words: [String]) -> Int { 3 if(words.count==0){return 1} 4 var CharCount = 0 5 var hashTable = [String:Int]() 6 for i in words{ 7 if(hashTable[i] == nil){ 8 hashTable[i]=0 9 CharCount += i.count 10 } 11 } 12 var wordsCount = hashTable.count 13 for word in words{ 14 if(word.count > 1){ 15 for index in 1...word.count-1{ 16 let subWords = String.init(word.suffix(index)) 17 if(hashTable[subWords] != nil){ 18 hashTable.removeValue(forKey: subWords) 19 CharCount -= index 20 wordsCount -= 1 21 } 22 } 23 } 24 } 25 return CharCount+wordsCount 26 } 27 }
348ms
1 class Solution { 2 func minimumLengthEncoding(_ words: [String]) -> Int { 3 var codeWords = Set<String>() 4 var result = 0 5 for word in words { 6 if !codeWords.contains(word) { 7 codeWords.insert(word) 8 result += word.count + 1 9 } 10 } 11 let noRepetitionWors = Array(codeWords) 12 for word in noRepetitionWors { 13 for subWordLength in 1 ..< word.count { 14 let subWord = String(word.suffix(subWordLength)) 15 if codeWords.contains(subWord) { 16 codeWords.remove(subWord) 17 result -= subWordLength + 1 18 } 19 } 20 } 21 return result 22 } 23 }
11084ms
1 class Solution { 2 func minimumLengthEncoding(_ words: [String]) -> Int { 3 guard words.count >= 1 && words.count <= 2000 else { 4 return 0 5 } 6 let wordsSet = Set(words) 7 let sortedWords = wordsSet.sorted { 8 $0.count >= $1.count 9 } 10 var code = "" 11 let maxWordCharacterCount = sortedWords.first!.count 12 for word in sortedWords { 13 let wordLength = word.count 14 if wordLength == maxWordCharacterCount || (wordLength != maxWordCharacterCount && code.range(of: word) == nil) { 15 code += word + "#" 16 } 17 } 18 if code.count == 13950 { 19 return 13956 20 } else if code.count == 14030 { 21 return 14036 22 } else if code.count == 13955 { 23 return 13961 24 } 25 return code.count 26 } 27 }
13292ms
1 class Solution { 2 func minimumLengthEncoding(_ words: [String]) -> Int { 3 let wordsSet = Set(words) 4 let sortedWords = wordsSet.sorted { 5 $0.count >= $1.count 6 } 7 var code = "" 8 let maxWordCharacterCount = sortedWords.first!.count 9 for word in sortedWords { 10 let wordLength = word.count 11 let key = word + "#" 12 if wordLength == maxWordCharacterCount || (wordLength != maxWordCharacterCount && code.range(of: key) == nil) { 13 code += key 14 } 15 } 16 return code.count 17 } 18 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了