图解DFS求解Word Break II -- LeetCode

来源:互联网 发布:adobe flash cc mac版 编辑:程序博客网 时间:2024/06/18 13:13
一直想写一篇技术类博客,苦于自己也是刚学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函数。


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

原创粉丝点击