JS算法-单词拆分

简介: JS算法-单词拆分

题目


给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s

输入: s = "applepenapple", wordDict = ["apple", "pen"]
输出: true
解释: 返回 true 因为 "applepenapple" 可以由 "apple" "pen" "apple" 拼接成。
     注意,你可以重复使用字典中的单词。


题解


第一种


首先,定义一个长度为len的数组dp,用于记录字符串s的前i个字符能否被拆分成若干个在字典中出现过的单词。接下来遍历字符串s的前i个字符,假设当前处理到了第i个字符,则:如果s的前i个字符是一个在字典中出现过的单词,则令dp[i]为true。如果s的前i个字符不是一个在字典中出现过的单词,则需要分别考虑以第j个字符为结尾、第i个字符为开头的子串subCur,其中j的范围从0到i。对于每个子串subCur,只有当subCur是一个在字典中出现过的单词,且dp[j-1]为true,即s的前j-1个字符可以被拆分成若干个在字典中出现过的单词,才能令dp[i]为true。最终返回dp[len-1]的值,即整个字符串s是否可以被拆分成若干个在字典中出现过的单词

var wordBreak = function (s, wordDict) {
    let len = s.length
    let dp = new Array(len).fill(false)
    for (let i = 0; i < len; i++) {
        let cur = s.substring(0, i + 1)
        if (wordDict.indexOf(cur)>-1) {
            dp[i] = true
        } else {
            for (let j = 0; j <= i; j++) {
                let subCur = s.substring(j, i + 1)
                dp[i] = dp[i] || (wordDict.indexOf(subCur)>-1 && dp[j - 1])
            }
        }
    }
    return dp[len - 1]
};


第二种


定义一个长度为 n+1 的数组 dp,其中 dp[i] 表示前 i 个字符是否可以拆分成 wordDict 中的单词。首先要将 wordDict 转化为一个 Set,方便后面的查找操作。初始化 dp[0] 为 true,因为空字符串肯定可以由 wordDict 中的单词组成。接下来是动态转移方程,对于每一个 i,都在从 0 到 i-1 的范围内进行循环。如果 dp[j] 为 true,且 s 的子串从 j 开始、长度为 i-j 的子串也在 wordDict 中出现,则将 dp[i] 设为 true 并跳出内层循环,因为已经找到一种拆分方案了。最后返回 dp[n] 即可,表示整个字符串是否可以被拆分成 wordDict 中的单词

 var wordBreak = function(s, wordDict) {
  const n = s.length;
  const wordDictSet = new Set(wordDict);
  const dp = new Array(n+1).fill(false);
  dp[0] = true;
  for(let i = 1;i<=n;i++){
    for(let j = 0;j<i;j++){
      if(dp[j] && wordDictSet.has(s.substr(j,i-j))){
        dp[i] = true;
        break;
      }
    }
  }
  return dp[n];
};
相关文章
|
3月前
|
算法 JavaScript 前端开发
第一个算法项目 | JS实现并查集迷宫算法Demo学习
本文是关于使用JavaScript实现并查集迷宫算法的中国象棋demo的学习记录,包括项目运行方法、知识点梳理、代码赏析以及相关CSS样式表文件的介绍。
第一个算法项目 | JS实现并查集迷宫算法Demo学习
|
4月前
|
JavaScript 算法 前端开发
JS算法必备之String常用操作方法
这篇文章详细介绍了JavaScript中字符串的基本操作,包括创建字符串、访问特定字符、字符串的拼接、位置查找、大小写转换、模式匹配、以及字符串的迭代和格式化等方法。
JS算法必备之String常用操作方法
|
4月前
|
JavaScript 算法 前端开发
JS算法必备之Array常用操作方法
这篇文章详细介绍了JavaScript中数组的创建、检测、转换、排序、操作方法以及迭代方法等,提供了数组操作的全面指南。
JS算法必备之Array常用操作方法
|
4月前
|
算法 JavaScript 前端开发
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
338 1
|
4月前
|
JavaScript 算法 前端开发
"揭秘Vue.js的高效渲染秘诀:深度解析Diff算法如何让前端开发快人一步"
【8月更文挑战第20天】Vue.js是一款备受欢迎的前端框架,以其声明式的响应式数据绑定和组件化开发著称。在Vue中,Diff算法是核心之一,它高效计算虚拟DOM更新时所需的最小实际DOM变更,确保界面快速准确更新。算法通过比较新旧虚拟DOM树的同层级节点,递归检查子节点,并利用`key`属性优化列表更新。虽然存在局限性,如难以处理跨层级节点移动,但Diff算法仍是Vue高效更新机制的关键,帮助开发者构建高性能Web应用。
80 1
|
4月前
|
算法 JavaScript 前端开发
对称加密算法解析:DES、AES及其在`pycryptodome` 和 `crypto-js` 模块中的应用
对称加密算法解析:DES、AES及其在`pycryptodome` 和 `crypto-js` 模块中的应用
206 1
|
4月前
|
JavaScript 算法 前端开发
国标哈希算法基础:SHA1、SHA256、SHA512、MD5 和 HMAC,Python和JS实现、加盐、算法魔改
国标哈希算法基础:SHA1、SHA256、SHA512、MD5 和 HMAC,Python和JS实现、加盐、算法魔改
639 1
|
4月前
|
算法 容器
【算法】滑动窗口——串联所有单词的子串
【算法】滑动窗口——串联所有单词的子串
|
5月前
|
算法 JavaScript
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
80 0
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
|
1天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
101 80