首页 > 其他分享 >139. 单词拆分

139. 单词拆分

时间:2024-03-20 10:57:08浏览次数:12  
标签:len 单词 划分 拆分 139 True dp 字典

给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。
注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。


题解

主要分类:动态规划
思路:这题的要点在于如何使用动态规划。这是打死我也想不出来的方法。

  1. 首先,我们要确定dp里面存储的是什么,建立dp[len(s)+1], 为什么是len(s)+1, 因为它存储的是其前0-i-1能否利用worddict里面的词划分。因此,很容易想到其基础dp[0]=True
  2. 那我们怎么确定前0-i-1是否能被其划分,状态如何转移。我们设置一个指针j, 让它依次遍历0-i-1检查是否存在一个位置使得0-j-1可以被划分,j-i-1也可以被划分,并且假设0-s1可以被划分s1-s2可以被划分那么0-s2也可以被划分,这样就不用去考虑其中有多少个单词,只需要知道它可以被划分就可以了。
  3. 因此,我们可以建立状态转移方程: dp[i] = dp[j] and (s[j:i] in worddict)
  4. 最后,return dp[len(s)+1]即可

例如:
s=applepenapple worddict=['pen', 'apple']
i = 1 a-> False
i = 2 p-> False
...
i = 5 当j=0的时候,满足要求, 因此dp[5]=True
...
i = 8 当j=5的时候,满足要求, 因此dp[8]=True
...
i=14, 当j=8的时候,满足要求, 因此dp[14]=True
最后返回True

代码如下:

class Solution:
    def wordBreak(self, s: str, wordDict: List[str]) -> bool:
        dp = [False for _ in range(len(s) + 1)]
        dp[0] = True
        for i in range(1, len(dp)):
            for j in range(0, i):
                dp[i] = dp[j] and (s[j:i] in wordDict)
                if dp[i]:
                    break
        return dp[len(dp)-1]

标签:len,单词,划分,拆分,139,True,dp,字典
From: https://www.cnblogs.com/zhumeili/p/18084737

相关文章

  • VBA读取 Excel 并按工作表拆分成多个 Excel
    新建窗体SubSplitExcelByMonth()'OnErrorGoToErrorHandler'启用错误处理OnErrorResumeNextApplication.ScreenUpdating=FalseApplication.DisplayAlerts=FalseDimexclePath,sourceSheetName,groupSheetName,filterI......
  • node实现将大CSV文件拆分小CSV
    constfs=require('fs');constreadline=require('readline');//定义输入文件的路径和输出文件的目录constinputFilePath='大的CSV文件.csv';constoutputDirectory='result'; //每个小文件包含的行数constlinesPerFile=250000;//创建输出目录if(......
  • Java 编程实例:相加数字、计算单词数、字符串反转、元素求和、矩形面积及奇偶判断
    Java如何相加两个数字相加两个数字示例intx=5;inty=6;intsum=x+y;System.out.println(sum);//打印x+y的和输出11解释首先,声明两个int类型的变量x和y,并分别赋值为5和6。然后,使用+运算符将x和y相加,并将结果赋给变量sum。最后,使用Sy......
  • CF1139E Maximize Mex
    传送门题意:在一所学校里有\(n\)名学生和\(m\)个社团,社团被编号为\(1\)~\(m\)。第\(i\)个学生有一个能力值\(p_i\),且属于社团\(c_i\)(每个学生恰好属于一个社团)。学校将要举行一个为期\(d\)天的活动,每天学校要举行一场程序设计比赛——校长将会从每个社团中各选......
  • CF1139D Steps to One
    期望就是\(\sum序列长度\times这个长度的概率\)我们先想长为\(x\)的序列出现的概率为多大长度为\(i\)的序列,对于每个约数,约数集合为\(\sigma\),出现概率为\(\sum_{p\in\sigma}(\frac{\lfloor\frac{m}{p}\rfloor}{m})^{i-1}\times\frac{m-\lfloor\frac......
  • 平面拆分
    引言题目链接:https://www.luogu.com.cn/problem/P8720思路首先可以画一个n=3的图找规律:可以发现划分的平面数有如下的规律:重边只有首次出现的那条会影响结果加入一条没有重边的直线,划分平面数+1新加入的直线与之前加入的直线有a个不同的交点,则划分平面数+a......
  • matinal:SAP FICO会计凭证如何实现自动拆分
    ......
  • NPL---自然语言处理单词界定问题
    2.1单词界定问题单词定界问题是属于词法层面的消歧任务。在口语中,词与词之间通常是连贯说出来的。在书面语中,中文等语言也没有词与词之间的边界。由于单词是承载语义的最小单元,要解决自然语言处理,单词的边界界定问题首当其冲。特别是中文文本通常由连续的字序列组成,词与词之间缺......
  • 杭电OJ 2072-单词数
    单词数因为新学了散列表容器map,这道题只用统计不同单词的总数,用映射再统计个数蛮合适,学以致用doge,需要注意文章开头可能有空格,最后要把空格这一映射减掉。AC代码:#include<iostream>#include<cstdio>#include<map>#include<string>usingnamespacestd;map<string,......
  • 【时事篇-05-03】20240316 一笔145元拆分成3笔存款存入(排除有相似性的十位数字)
    背景需求前文提到,每笔都存一样的数目,容易被银行识别违法,【时事篇-05-01】20240112150元存46只货币基金-CSDN博客文章浏览阅读580次,点赞15次,收藏11次。【时事篇-05-01】20240112150元存46只货币基金https://blog.csdn.net/reasonsummer/article/details/136106686前几天我......