文章推荐:接口设计中的数据精简技巧:提升效率与优化传输
文章链接:https://cloud.tencent.com/developer/article/2469020
文章简介:本文探讨常见的数据精简技术,如字段筛选、数据压缩,以及如何在实际开发中使用这些技术优化接口数据传输效率。通过 ArkUI 和 ArkTS,展示了一个可运行的 Demo 代码模块,帮助开发者理解并实践这些技巧。感兴趣的同学可以看看!
本题由于没有合适答案为以往遗留问题,最近有时间将以往遗留问题一一完善。
我们社区陆续会将顾毅(Netflix 增长黑客,《iOS 面试之道》作者,ACE 职业健身教练。)的 Swift 算法题题解整理为文字版以方便大家学习与阅读。
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
难度水平:中等
给你一个字符串 s
和一个字符串列表 wordDict
作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s
则返回 true
。
注意: 不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。
## 2. 示例
示例 1:
输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。
示例 2:
输入: s = "applepenapple", wordDict = ["apple", "pen"]
输出: true
解释: 返回 true 因为 "applepenapple" 可以由 "apple" "pen" "apple" 拼接成。
注意,你可以重复使用字典中的单词。
示例 3:
输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
输出: false
提示:
1 <= s.length <= 300
1 <= wordDict.length <= 1000
1 <= wordDict[i].length <= 20
s
和 wordDict[i]
仅由小写英文字母组成wordDict
中的所有字符串 互不相同我们可以使用动态规划(Dynamic Programming, DP)来解决该问题。
dp
表示字符串的可拼接状态。dp[i]
表示字符串 s[0..<i]
是否可以由字典中的单词拼接而成。j
,使得 dp[j] == true
且 s[j..<i]
是字典中的一个单词,则 dp[i] = true
。dp[i]
取决于之前某个位置 j
的状态和当前子字符串是否在字典中。dp[0] = true
,表示空字符串可以被拼接。dp[s.count]
。func wordBreak(_ s: String, _ wordDict: [String]) -> Bool {
// 将 wordDict 转换为 Set,方便快速查询单词是否存在
let wordSet = Set(wordDict)
let n = s.count
// 初始化 DP 数组,默认值为 false
var dp = Array(repeating: false, count: n + 1)
dp[0] = true // 空字符串可以被拼接
// 将字符串转换为字符数组,便于索引操作
let sArray = Array(s)
// 遍历字符串长度
for i in 1...n {
// 检查所有可能的子字符串
for j in 0..<i {
// 子字符串 s[j..<i]
let substring = String(sArray[j..<i])
if dp[j] && wordSet.contains(substring) {
dp[i] = true
break
}
}
}
return dp[n]
}
wordDict
转换为 Setlet wordSet = Set(wordDict)
将字典转换为 Set,可以将查找时间从 O(k)
降低到 O(1)
,其中 k
是字典中单词的个数。
var dp = Array(repeating: false, count: n + 1)
dp[0] = true
dp[i]
的值表示从字符串的起始到第 i
个字符(不含 i
)的子字符串是否可以拼接。dp[0] = true
表示空字符串总是可以拼接。for i in 1...n {
for j in 0..<i {
let substring = String(sArray[j..<i])
if dp[j] && wordSet.contains(substring) {
dp[i] = true
break
}
}
}
i
,检查从 j
到 i
的子字符串 s[j..<i]
是否存在于字典中。dp[j] == true
,说明从 0..<j
的部分可以拼接,则更新 dp[i] = true
。return dp[n]
dp[n]
表示整个字符串是否可以拼接。
let s = "leetcode"
let wordDict = ["leet", "code"]
print(wordBreak(s, wordDict)) // 输出: true
解释: s
可以拆分为 "leet" 和 "code",两者都在字典中。
let s = "applepenapple"
let wordDict = ["apple", "pen"]
print(wordBreak(s, wordDict)) // 输出: true
解释: s
可以拆分为 "apple"、"pen" 和 "apple",所有单词都在字典中。
let s = "catsandog"
let wordDict = ["cats", "dog", "sand", "and", "cat"]
print(wordBreak(s, wordDict)) // 输出: false
解释: 无法将 s
拆分成字典中的单词组合。
n
。j
到 i
,最多运行 n
次。O(1)
。总时间复杂度为 O(n²)。
wordSet
占用 O(k),其中 k
是字典中单词的个数。总空间复杂度为 O(n + k)。
我们是由 Swift 爱好者共同维护,我们会分享以 Swift 实战、SwiftUI、Swift 基础为核心的技术内容,也整理收集优秀的学习资料。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。