首页 > 其他分享 >leetcode 139. 单词拆分(BFS 或者 DP)

leetcode 139. 单词拆分(BFS 或者 DP)

时间:2022-12-12 19:33:56浏览次数:47  
标签:单词 return int BFS wordDict 139 leetcode dp 字典


题目大意:

给定一个非空字符串 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

解题思路:

第一种是搜索的思路,使用BFS,每次我们队列push单词的起始搜索位置,然后枚举单词结束的位置,用hash表来存字典,看字典中是否存在这一个单词,存在的话开始下一个位置查找。为了避免搜索同一个位置,可以打一个标志数组dp,大家可以试一下不用这个标志数组运行速度是否有差异。

class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
queue<int> q;
int u = 0;
vector<int> dp;
dp.assign(s.size()+10,0);
q.push(u);
unordered_set<string> ms;
for(auto it:wordDict)ms.insert(it);
while(!q.empty()){
int u = q.front();q.pop();
if(u == s.size())return true;
for(int i = u;i<(int)s.size();i++){
if(ms.count(s.substr(u,i-u+1))){
if(dp[i+1])continue;
dp[i+1] = 1;
q.push(i+1);
}
}
}
return false;
}
};

第二种思路:

假设dp[n]为s字符串的第n位是否可行,我们得到转移方程为:

for( i = 0 ;i<dict.size();i++)

if(s contain word word[i] from n position)

dp[n] |= dp[n+word[i].length()]

class Solution {
public:
vector<int> dp;
string str;
vector<string> arrmv;
int N;
bool dfs(int n ){

if(n == N)return 1;
if(dp[n]!=-1)return dp[n];
int ret = 0;
for(int i = 0;i<(int)arrmv.size();i++){
int len2 = arrmv[i].size();

if(n+len2-1<=N-1 ){
int suc = 1;
for(int j = 0;j<len2;j++)if(arrmv[i][j]!=str[n+j])suc = 0;

if(suc)ret|=dfs(n+len2);

}

}
return dp[n] = ret;
}
bool wordBreak(string s, vector<string>& wordDict) {
str= s;
N=str.size();
arrmv=wordDict;
dp.assign(s.size()+1,-1);
return dfs(0);
}
};

 

标签:单词,return,int,BFS,wordDict,139,leetcode,dp,字典
From: https://blog.51cto.com/u_15910522/5931543

相关文章

  • leetcode 155. 最小栈(辅助栈)
    题目大意:设计一个支持push,pop,top操作,并能在常数时间内检索到最小元素的栈。push(x)——将元素x推入栈中。pop() ——删除栈顶的元素。top() ——获取栈顶元素......
  • leetcode 128. 最长连续序列 (hash,暴力)
    题目大意:给定一个未排序的整数数组,找出最长连续序列的长度。要求算法的时间复杂度为 O(n)。解题思路:我们每次枚举数字的第一个,然后往后数有多少个。可以证明每个数字只会被......
  • #yyds干货盘点# LeetCode程序员面试金典:链表相交
    题目:给你两个单链表的头节点 headA​ 和 headB​ ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。图示两个链表在节点 c1 开始相交:题目......
  • #yyds干货盘点# LeetCode程序员面试金典:回文链表
    题目:编写一个函数,检查输入的链表是否是回文的。 示例1:输入:1->2输出:false示例2:输入:1->2->2->1输出:true代码实现:classSolution{publicbooleanisPalindrome(L......
  • 力扣 leetcode 22. 括号生成
    问题描述数字n代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。提示:1<=n<=8示例示例1:输入:n=3输出:["((()))","(()())",......
  • 力扣 leetcode 213. 打家劫舍 II
    问题描述你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋......
  • 力扣 leetcode 62. 不同路径
    问题描述一个机器人位于一个mxn网格的左上角(起始点在下图中标记为“Start”)。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为......
  • 【Java】【LeetCode】字符串操作
    将空格替换成"%20"Stringa=s.replace("","%20");//注意replace不是直接在s上做修改,而是返回了一个字符串StringBuilderStringBuildersb=newStringBuilder("1234a......
  • #yyds干货盘点# LeetCode程序员面试金典:链表求和
    题目:给定两个用链表表示的整数,每个节点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。 示例:输入:(7->1->......
  • 算法12:LeetCode_二叉树的最大深度
    给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树[3,9,20,null,null,......