LeetCode算法学习之单词拆分
完整代码实现
class Solution {public boolean wordBreak(String s, List<String> wordDict) {Set<String> wordSet = new HashSet<>(wordDict);int n = s.length();boolean[] dp = new boolean[n + 1];dp[0] = true; // 空字符串可以被拼接for (int i = 1; i <= n; i++) {for (int j = 0; j < i; j++) {if (dp[j] && wordSet.contains(s.substring(j, i))) {dp[i] = true;break; // 找到一个可行的分割即可}}}return dp[n];}
}解题思路:
核心思想
使用**动态规划(Dynamic Programming)**来解决该问题。动态规划通过将问题分解为子问题,并存储子问题的解来避免重复计算,从而提高效率
算法步骤
1. 初始化:
将 wordDict 转换为哈希集合 wordSet,以便快速查找单词是否存在
创建布尔数组 dp,长度为 n + 1(n 为字符串 s 的长度),dp[i] 表示 s 的前 i 个字符(即 s[0..i-1])是否可以被字典中的单词拼接出来
初始化 dp = true,表示空字符串可以被拼接(即不使用任何单词)
2. 填充动态规划数组:
外层循环遍历 i 从 1 到 n,表示当前处理到 s 的前 i 个字符
内层循环遍历 j 从 0 到 i-1,表示尝试将 s 分割为 s[0..j-1] 和 s[j..i-1] 两部分
如果 dp[j] 为 true(即 s[0..j-1] 可以被拼接),且子串 s[j..i-1] 存在于 wordSet 中,则说明 s[0..i-1] 可以被拼接,设置 dp[i] = true 并跳出内层循环
3. 返回结果:
dp[n] 表示整个字符串 s 是否可以被字典中的单词拼接出来,直接返回 dp[n] 即可
