
文章推荐:接口设计中的数据精简技巧:提升效率与优化传输
文章链接: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 <= 3001 <= wordDict.length <= 10001 <= wordDict[i].length <= 20s 和 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] = truedp[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 删除。