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

LeetCode -- WordBreak II

题目描述:


Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word.


Return all such possible sentences.


For example, given
s = "catsanddog",
dict = ["cat", "cats", "and", "sand", "dog"].


A solution is ["cats and dog", "cat sand dog"].




给定1个字符串s,和一个字典(字符串数组),对s进行分词,求出所有可能情况。


从题目本身来看,本题的解法是一个DFS,拿到s.substr[0...n],如果在dic中存在,则拿到当前index对s.substr[index...n]递归执行,如果s在dic中找到,添加到结果集。 由于没有剪枝,存在很多不必要的递归。


剪枝:可以使用长度为s.Length的数组来存放s在每一位是否存在可能解。在继续递归之前,把当前的解集存一下,递归之后,解集没有改变,说明没有继续执行的必要。




实现代码:




public IList<string> WordBreak(string s, ISet<string> wordDict) 
   {
		var results = new List<string>();
		var possible = new bool[s.Length];
		for(var i = 0;i < possible.Length; i++){
			possible[i] = true;
		}
		
		DfsWithCut(0,s, wordDict, "", results, possible);
		return results;
   }


public void DfsWithCut(int start , string s, ISet<string> wordDic, string result, IList<string> results, bool[] possible){


	var left = s.Substring(start , s.Length - start);
	if(wordDic.Any(x=> x == left)){
		var r = result == "" ? left : result + " " + left;
		results.Add(r);
	}
	
   for(var i = start ;i < s.Length ; i++){
       var w = s.Substring(start, i - start + 1);


       if(wordDic.Any(x=>x == w) && i < s.Length - 1){
           if(possible[i+1] /*only if possible do recursion*/){
		       var r = result == "" ? w : result + " " + w;
			   var before = results.Count; // track current results count before dfs
               DfsWithCut(i + 1, s , wordDic, r, results, possible);
			   if(results.Count == before){ // since no new result found , mark possible[i+1] as false to cut it
			   		possible[i+1] = false;
			   }
           }
		   
       }
   }
   
}


相关文章:

  • Azure 证书配置错误: The service configuration file does not provide the certificate identification
  • Linux精彩一句话最新版
  • LeetCode -- Count Complete Tree Node
  • LeetCode -- Isomorphic Strings
  • LeetCode -- Balanced Binary Tree
  • Linux系统信息查看命令大全
  • LeetCode -- Merge Two sorted lists
  • 汇编语言程序设计的基本方法
  • LeetCode -- Binary Tree Zigzag Level Order Traversal
  • PostgreSQL+PostGIS的使用 1
  • LeetCode -- Compare Version Numbers
  • LeetCode -- Implement Queue using Stacks
  • PostgreSQL+PostGIS的使用 2
  • 有关微软技术方向的最新学习资源【2015-9月】
  • PostgreSQL+PostGIS的使用 3
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • es的写入过程
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 普通函数和构造函数的区别
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 什么是Javascript函数节流?
  • 推荐一个React的管理后台框架
  • 我看到的前端
  • 一些关于Rust在2019年的思考
  • 由插件封装引出的一丢丢思考
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 怎样选择前端框架
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • python最赚钱的4个方向,你最心动的是哪个?
  • 带你开发类似Pokemon Go的AR游戏
  • #define
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (MATLAB)第五章-矩阵运算
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (五)IO流之ByteArrayInput/OutputStream
  • (转)树状数组
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .Net Core和.Net Standard直观理解
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET/C# 使用反射注册事件
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • @Autowired标签与 @Resource标签 的区别
  • @Data注解的作用
  • @RestController注解的使用
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)