算法与数据结构(单词拆分)

题目

思路

动态规划

这道题可以利用动态规划来判断字符串 s 是否能被拆分成字典 wordDict 中的单词。具体做法是:先将字典存入哈希集合以便快速查找,然后初始化一个 dp 数组,其中 dpi 表示 s 的前 i 个字符能否被拆分。初始时 dp0 设为 true(空字符串可拆分),接着遍历字符串,对于每个位置 i,检查所有可能的分割点 j,如果前 j 个字符可拆分(dpj 为 true)且子串 sj..i-1 在字典中,则标记 dpi 为 true。最终,dps.size() 的值即为整个字符串 s 是否能被拆分的结果。

代码详解

首先我们可以将wordDict中的单词全都存入哈希表中,方便后面的判断。

接着定义dp,它是用来判断前面的字符能否被拆分。若dpi为false,则表示不可以。相反,若为true则为可以。

至于为什么创建它时空间为s.size()+1

因为 dpi 表示的是 前 i 个字符,而 s 的索引是从 0 开始的:

s0..i-1 对应 dpi(前 i 个字符)。

如果 dp 的大小是 s.size(),那么 dps.size() 就无法表示整个字符串(因为 s.size() 是 8,但 dp8 需要表示 s0..7)。

dp0=true意味着空字符串可以被拆分

i变量是用来遍历所有可能的前缀长度,j是用来遍历所有的分割点。

s0,j-1能否被拆分(由dpj)决定

sj,i是否在字典中(由 wordDictSet.find() 决定)

代码

cpp 复制代码
class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) 
    {
           auto wordDictSet = unordered_set<string> ();
           for(auto &x: wordDict)
           {
                wordDictSet.insert(x);
           }
           vector<bool> dp(s.size()+1); // 默认是false
           dp[0]=true;
           for(int i=1;i<=s.size();i++)
           {
                for(int j=0;j<i;j++)
                {
                    if(wordDictSet.find(s.substr(j,i-j))!=wordDictSet.end() && dp[j])
                    {
                        dp[i] = true;
                        break;
                    }
                }
           }
           return dp[s.size()];
    }
};
相关推荐
星释10 分钟前
鸿蒙智能体开发实战:35.鸿蒙壁纸大师 - 调用火山引擎模型生成壁纸
算法·华为·ai·harmonyos·鸿蒙·火山引擎
小七在进步20 分钟前
数据结构:用栈实现队列
开发语言·数据结构
geovindu21 分钟前
go: Floyd-Warshall Algorithms
开发语言·后端·算法·golang
db_murphy29 分钟前
机器学习决策树的基尼系数是个啥?
学习·算法
拳里剑气36 分钟前
C++算法:优先级队列
开发语言·c++·算法·优先级队列
小七在进步37 分钟前
数据结构:用队列实现栈
开发语言·数据结构
Turbo正则1 小时前
机器学习入门笔记 | 基础算法及其应用场景
笔记·算法·机器学习
东华万里1 小时前
第37篇 手撕二叉树与堆的底层逻辑
数据结构·算法
知无不研1 小时前
算法:判断一个数是不是2的幂
数据结构·算法
luj_17689 小时前
残熵算法实时化三大瓶颈突破
c语言·开发语言·网络·经验分享·算法