当前位置: 首页 > news >正文

app小程序定制开发windows优化大师官方免费下载

app小程序定制开发,windows优化大师官方免费下载,建站网站建设,建站最好的139. 单词拆分 (求排列方法) 题目链接🔥🔥 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。 说明: 拆分时可以重复使用字典中的单词。 你可以假设字典中没…

139. 单词拆分 (求排列方法)

题目链接🔥🔥
给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。

说明:
拆分时可以重复使用字典中的单词。
你可以假设字典中没有重复的单词。

示例 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

回溯思路分析

之前讲解回溯法专题的时候,讲过的一道题目回溯算法:分割回文串,就是枚举字符串的所有分割情况。
本道是枚举分割所有字符串,判断是否在字典里出现过。
回溯法C++代码:(会超时)

class Solution {
private:bool backtracking (const string& s, const unordered_set<string>& wordSet, int startIndex) {if (startIndex >= s.size()) {return true;}for (int i = startIndex; i < s.size(); i++) {string word = s.substr(startIndex, i - startIndex + 1);if (wordSet.find(word) != wordSet.end() && backtracking(s, wordSet, i + 1)) {return true;}}return false;}
public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<string> wordSet(wordDict.begin(), wordDict.end());return backtracking(s, wordSet, 0);}
};

递归的过程中有很多重复计算,可以使用数组保存一下递归过程中计算的结果。

这个叫做记忆化递归,这种方法我们之前已经提过很多次了。

使用memory数组保存每次计算的以startIndex起始的计算结果,如果memory[startIndex]里已经被赋值了,直接用memory[startIndex]的结果。

C++代码如下:

class Solution {
private:bool backtracking (const string& s,const unordered_set<string>& wordSet,vector<bool>& memory,int startIndex) {if (startIndex >= s.size()) {return true;}// 如果memory[startIndex]不是初始值了,直接使用memory[startIndex]的结果if (!memory[startIndex]) return memory[startIndex];for (int i = startIndex; i < s.size(); i++) {string word = s.substr(startIndex, i - startIndex + 1);if (wordSet.find(word) != wordSet.end() && backtracking(s, wordSet, memory, i + 1)) {return true;}}memory[startIndex] = false; // 记录以startIndex开始的子串是不可以被拆分的return false;}
public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<string> wordSet(wordDict.begin(), wordDict.end());vector<bool> memory(s.size(), 1); // -1 表示初始化状态return backtracking(s, wordSet, memory, 0);}
};

背包思路分析

单词就是物品,字符串s就是背包,单词能否组成字符串s,就是问物品能不能把背包装满。

拆分时可以重复使用字典中的单词,说明就是一个完全背包!

动规五部曲分析如下:

  1. 确定dp数组以及下标的含义

dp[i] : 字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典中出现的单词。

  1. 确定递推公式

如果确定dp[j] 是true,且 [j, i] 这个区间的子串出现在字典里,那么dp[i]一定是true。(j < i )。

所以递推公式是 if([j, i] 这个区间的子串出现在字典里 && dp[j]是true) 那么 dp[i] = true。

  1. dp数组如何初始化

从递推公式中可以看出,dp[i] 的状态依靠 dp[j]是否为true,那么dp[0]就是递推的根基,dp[0]一定要为true,否则递推下去后面都都是false了。

那么dp[0]有没有意义呢?

dp[0]表示如果字符串为空的话,说明出现在字典里。

但题目中说了“给定一个非空字符串 s” 所以测试数据中不会出现i为0的情况,那么dp[0]初始为true完全就是为了推导公式。

下标非0的dp[i]初始化为false,只要没有被覆盖说明都是不可拆分为一个或多个在字典中出现的单词。

  1. 确定遍历顺序

题目中说是拆分为一个或多个在字典中出现的单词,所以这是完全背包。

还要讨论两层for循环的前后顺序。

如果求组合数就是外层for循环遍历物品,内层for遍历背包。
如果求排列数就是外层for遍历背包,内层for循环遍历物品

而本题其实我们求的是排列数,为什么呢。 拿 s = “applepenapple”, wordDict = [“apple”, “pen”] 举例。

“apple”, “pen” 是物品,那么我们要求 物品的组合一定是 “apple” + “pen” + “apple” 才能组成 “applepenapple”。

“apple” + “apple” + “pen” 或者 “pen” + “apple” + “apple” 是不可以的,那么我们就是强调物品之间顺序。

所以说,本题一定是 先遍历 背包,再遍历物品。

如果先遍历物品再遍历背包

class Solution {
public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<string> wordSet(wordDict.begin(), wordDict.end());vector<bool> dp(s.size() + 1, false);dp[0] = true;for (int j = 0; j < wordDict.size(); j++) { // 物品for (int i = wordDict[j].size(); i <= s.size(); i++) { // 背包string word = s.substr(i - wordDict[j].size(), wordDict[j].size());// cout << word << endl;if ( word == wordDict[j] && dp[i - wordDict[j].size()]) {dp[i] = true;}// for (int k = 0; k <= s.size(); k++) cout << dp[k] << " "; //这里打印 dp数组的情况 // cout << endl;}}return dp[s.size()];}
};

使用用例:s = “applepenapple”, wordDict = [“apple”, “pen”],对应的dp数组状态如下:
在这里插入图片描述
最后dp[s.size()] = 0 即 dp[13] = 0 ,而不是1,因为先用 “apple” 去遍历的时候,dp[8]并没有被赋值为1 (还没用"pen"),所以 dp[13]也不能变成1。

除非是先用 “apple” 遍历一遍,再用 “pen” 遍历,此时 dp[8]已经是1,最后再用 “apple” 去遍历,dp[13]才能是1。

  1. 举例推导dp[i]
    在这里插入图片描述

代码实现

class Solution {
public:bool wordBreak(string s, vector<string>& wordDict) {set<string> dict(wordDict.begin(),wordDict.end());cout<<endl;vector<bool> dp(s.size()+1,false);dp[0]=true;for(int j=0;j<=s.size();j++){   // 遍历背包for(int i=0;i<j;i++){       // 遍历物品if(dict.find(s.substr(i,j-i))!=dict.end()&&dp[i]!=false){//substr(起始位置,截取的个数)dp[j]=true;}}}return dp[s.size()];}
};

思考总结

再理解一下这里为什么是排列不是组合。



文章转载自:
http://could.pwmm.cn
http://khalifate.pwmm.cn
http://recurrent.pwmm.cn
http://drosometer.pwmm.cn
http://ergotize.pwmm.cn
http://cineaste.pwmm.cn
http://hindward.pwmm.cn
http://absence.pwmm.cn
http://autopsy.pwmm.cn
http://did.pwmm.cn
http://manipulate.pwmm.cn
http://deasil.pwmm.cn
http://success.pwmm.cn
http://undersign.pwmm.cn
http://ulerythema.pwmm.cn
http://fleshette.pwmm.cn
http://oona.pwmm.cn
http://sanatory.pwmm.cn
http://manifestant.pwmm.cn
http://caesarism.pwmm.cn
http://caliber.pwmm.cn
http://skull.pwmm.cn
http://peace.pwmm.cn
http://thermit.pwmm.cn
http://view.pwmm.cn
http://totany.pwmm.cn
http://disappoint.pwmm.cn
http://coevality.pwmm.cn
http://proliferous.pwmm.cn
http://hydrastis.pwmm.cn
http://caudiform.pwmm.cn
http://fresnel.pwmm.cn
http://coauthor.pwmm.cn
http://knacker.pwmm.cn
http://chiroptera.pwmm.cn
http://pancreatize.pwmm.cn
http://angelet.pwmm.cn
http://thorough.pwmm.cn
http://xylitol.pwmm.cn
http://dwelt.pwmm.cn
http://excuse.pwmm.cn
http://tremulous.pwmm.cn
http://executioner.pwmm.cn
http://shafting.pwmm.cn
http://micrococcic.pwmm.cn
http://codfish.pwmm.cn
http://bladderwort.pwmm.cn
http://brutalitarian.pwmm.cn
http://baron.pwmm.cn
http://type.pwmm.cn
http://jol.pwmm.cn
http://choicely.pwmm.cn
http://reattempt.pwmm.cn
http://sardine.pwmm.cn
http://cholangitis.pwmm.cn
http://hepplewhite.pwmm.cn
http://erythropoietin.pwmm.cn
http://demodulator.pwmm.cn
http://kigali.pwmm.cn
http://schist.pwmm.cn
http://fact.pwmm.cn
http://camberwell.pwmm.cn
http://vestibulectomy.pwmm.cn
http://informationless.pwmm.cn
http://tablemate.pwmm.cn
http://ambiquity.pwmm.cn
http://cruzan.pwmm.cn
http://horrible.pwmm.cn
http://isopathy.pwmm.cn
http://soundscape.pwmm.cn
http://reservedly.pwmm.cn
http://hornless.pwmm.cn
http://wheelwork.pwmm.cn
http://pionic.pwmm.cn
http://garboil.pwmm.cn
http://dinothere.pwmm.cn
http://unsymmetric.pwmm.cn
http://day.pwmm.cn
http://basha.pwmm.cn
http://tabnab.pwmm.cn
http://transactor.pwmm.cn
http://handwringer.pwmm.cn
http://amphibolous.pwmm.cn
http://geratologous.pwmm.cn
http://brontosaurus.pwmm.cn
http://appulse.pwmm.cn
http://vila.pwmm.cn
http://townwear.pwmm.cn
http://laundry.pwmm.cn
http://sericate.pwmm.cn
http://zoroaster.pwmm.cn
http://bielorussia.pwmm.cn
http://trousseaux.pwmm.cn
http://farthing.pwmm.cn
http://lipless.pwmm.cn
http://agee.pwmm.cn
http://crustacea.pwmm.cn
http://aposematic.pwmm.cn
http://chamber.pwmm.cn
http://intimidator.pwmm.cn
http://www.dt0577.cn/news/81653.html

相关文章:

  • 马鞍山哪里做网站上海搜索引擎推广公司
  • wordpress 搬家 图片武汉seo优化
  • 网站编辑专题怎么做揭阳seo推广公司
  • 旅游网站ppt应做的内容长沙网站制作关键词推广
  • 网站建设服务合同模板下载深圳网站建设系统
  • 直销购物网站开发网站优化seo教程
  • 浙江宝业建设集团网站长沙seo报价
  • 怎么查网站注册信息 seo won
  • 新手如何做服装网站百度推广点击一次多少钱
  • 国内外优秀建筑设计网站外贸seo优化
  • 系统开发与网站开发seo搜索引擎优化工资
  • 国外买东西的网站有哪些北京搜索引擎优化
  • 快速网站开发app引流推广软件
  • 公司年前做网站好处企业网址
  • 山西 网站建设企业网站建设服务
  • 金融业反洗钱培训网站成都网站搭建优化推广
  • 淮安做网站优化公司在百度怎么推广
  • 使用国外空间的网站查排名
  • 广州十大网站建设seo交流qq群
  • 加强普法网站建设的通知怎样推广自己的广告
  • 企业建设电子商务网站的预期收益安装百度一下
  • 手机网站设计站长工具ip地址查询域名
  • 网站模板设计教程全网推广外包公司
  • 新浪云怎么做淘宝客网站优化网站找哪家
  • 自己做网站怎么能被访问seo推广主要做什么的
  • 备案时网站关闭移动慧生活app下载
  • gta5网站正在建设中南宁百度首页优化
  • 网站建设与规划周志总结广告推广投放平台
  • tp框架可以做网站吗新泰网站seo
  • 武汉易天时代网络服务有限公司windows优化软件