图解DFS求解Word Break II -- LeetCode

一直想写一篇技术类博客,苦于自己也是刚学Java不久,没有想出有价值的东西,就一直没有写。最近在刷leetcode的题,分析大神所写的代码,总结思路。大神的思路分析侧重于文字方面,由于我基础一般不能很好的理解,只能靠着Eclipse的debug功能调试分析。勉强能够看懂了,但是不能很好的转化为自己的东西,业余时间看了很多关于图解思考方面的资料感觉不错,可以拿过来用于分析算法的思路,有助于理解,今天分享我自己分析出的一个使用DFS(深度优先搜索)求解wordBreakII的过程,代码是大神 Code_Ganker写的,我只是添加了思考过程,在此声明一下。原始链接: http://blog.csdn.net/linhuanmars/article/details/22452163

题目如下:

Given a string s and a dictionary of wordsdict, add spaces in s to construct a sentence where each word is a validdictionary 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"].


Code_Ganker在求解过程中采用了DFS方法进行暴力求解,总共找到了两组结果分别为[cat, sand, dog]和[cats, and, dog],具体的图解如下所示。


下面对上图进行简单的分析,具体的细节,大家自己调试一下就清楚了。

1.首先向helper方法中传入字符串catsanddog,字典["cat","cats", "and", "sand", "dog"],开始查找位置0,接收结果的集合res

2.helper方法开始遍历整个字符串,从i = 0开始,用stringbuilder接收截取的字符串,当i = 2时,str中截取的子串为cat,字典中含有该子串,添加到item中。

3.调用helper,此时i = 3开始查找,找到了sand,字典比对后发现存在,添加到item中,此时item = {cat sand}。

4.继续调用helper,此时i = 7开始查找,找到了sand,字典比对后发现存在,添加到item中,此时item = {cat sand dog}。

5.继续调用helper,此时i = 10,超过了字符串长度9,符合终止条件,将item添加到res中。

6.向上回溯到i = 9,此时程序结束,继续回溯到i = 7,i++,查找是否有子串在字典中,没找到,回溯到i = 3,i++,在cat基础上继续添加s编程cats。

7.转换到了树的另外一个分支,cats在字典中存在,添加到item中。

8.继续调用helper向下搜索,此时i = 4,从i = 4开始截取当i = 6时,截取了子串and。and在字典中,添加到item中,此时item = [cats and]。

9.继续调用helper向下搜索,此时i = 7,从i = 7开始截取当i = 9时,截取了子串dog。dog在字典中,添加到item中,此时item = [cats and dog]

10.继续调用helper,此时i = 10,超过了字符串长度9,符合终止条件,将item添加到res中。此时res中有两个结果。

11.向上回溯到i = 9,此时程序结束,继续回溯到i = 7,i++,查找是否有子串在字典中,没找到,回溯到i = 3,i++,没找到,将res返回main函数。


这道题的思路我的理解就是这样的,如果有不对的地方,希望大家能够批评指正。通过图解分析思路容易理解,希望大家共同进步!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值