leetcode_Word Break

描述:

Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words.

For example, given

s = “leetcode”,

dict = [“leet”, “code”].

Return true because “leetcode” can be segmented as “leet code”.

思路:

刚开始拿到这题时,直接用循环的方式来做,即用一个while((index=s.indexOf(str))!=-1)将所有符合要求的str穷举出来,一边穷举一边删除已经出现的字符串,但是,对s=”aaaaaaa”,setArr={“aaaa”,”aa”,”aaa”}这种测试用例就没招了,很显然到”aa”时已经将s删的只剩下”a”了,结果肯定不行。这种方法的缺点是不能记忆已经产生的结果并推倒重来。

关于推倒重来,回溯法倒是不错,就像八皇后问题那样,但是问题不是变得越来越复杂了么。

最后,还是用动态规划解决了该问题,先从第一个字符开始比对以第一个字符开始的字符串和set里面的字符串进行比对,如果有相同的字符串就将(i+str.length())处标记为true,依次类推,但只有在第i位已经被标记为true的位置才可以作为比对的开始位置,就像接力赛一样。最后能接力到最后的话就表示字符串可以分解为字典集合里面的元素。

感觉还是代码更好理解,直接上代码:

代码:

public  boolean wordBreak(String s, Set<String> wordDict) {
        if(s==null)
            return true;
        BitSet set=new BitSet();
        set.set(0);//第一个肯定是匹配的,否则游戏还怎么玩?
        int len=s.length();
        int tempLen=0,endIndex=0;
        for(int i=0;i<len;i++)
        {
            //保证后面的匹配都是在前面匹配的基础上
            if(!set.get(i))进行
                continue;
            //在前面标记的基础上标记所有可能的匹配
            for(String str:wordDict)
            {
                tempLen=str.length();
                endIndex=i+tempLen;
                if(endIndex>len)//超出了要标记的范围
                    continue;
                if(set.get(endIndex))
                    continue;
                if(s.subSequence(i, endIndex).equals(str))
                    set.set(endIndex);
            }
        }
        //在前面标记的基础上能否到达最后一站就决定了是否能成功匹配
        return set.get(len);

    }
时间: 2024-10-09 07:52:24

leetcode_Word Break的相关文章

LeetCode_Word Break II

LeetCode_Word Break II 一.题目描述: 二.解决思路: 题目要求我们要在原字符串中加空格,使得隔开的每个词都是词典中的词. 所以我们大可以按顺序扫描每个字符,但是然后当碰到是词典中的词,就加个空格,但是要求返回的结果按题目的提醒是个List,说明有很多分隔方式. 再细细想问题,我们发现第二个词能被成功分隔出来,是因为第一个词已经分出来了,依次类推:所以我们可以采用动态规划,设置初值dp[0] 是一个 List:递推式是 dp[n] = dp[n-1] && a[n]

LeetCode_DP_Word Break II

LeetCode_Word Break II 一.题目描写叙述: 二.解决思路: 题目要求我们要在原字符串中加空格,使得隔开的每一个词都是词典中的词. 所以我们大能够按顺序扫描每一个字符.可是然后当碰到是词典中的词.就加个空格,可是要求返回的结果按题目的提醒是个List,说明有非常多分隔方式. 再细细想问题.我们发现第二个词能被成功分隔出来,是由于第一个词已经分出来了.依次类推:所以我们能够採用动态规划,设置初值dp[0] 是一个 List:递推式是 dp[n] = dp[n-1] &&

while与do while 区别 for循环的简介及break和continue的区别

do while 循环和while循环的区别   1.do while循环是先执行循环体,然后判断循环条件,如果为真,则执行下一步循环,否则终止循环:    while循环是先判断循环条件,如果条件为真则执行循环体:   2.do while循环条件后面必须有一个分号,这个分号表明循环结束. 1.for循环 for循环是更加简洁的循环语句,大部分情况下,for循环可以代替while循环.do-while循环. for循环的格式为: for( 初始语句  ; 执行条件  ; 增量 ) { 循环体

第五节:python continue break的用法

for i in range(1,100):   if i==50:     print 'i have print 50'     continue  print i 此处的print i 和 if i==50:属于同级,执行的都是上级for.  print 'i have print 50' 和continue属于同级. continue 为跳出本次循环,break为跳出整个循环.两者只能在循环中使用.

shell编程中for,while,util,case,select,break, continue用法详解

关于shell脚本的更多详细实例讲解请参考:http://www.cnblogs.com/yuexiaxiaoxi/category/646749.html Shell编程中循环命令用于特定条件下决定某些语句重复执行的控制方式,有三种常用的循环语句:for.while和until.while循环和for循环属于"当型循环",而until属于"直到型循环".循环控制符:break和continue控制流程转向. 参考:<Linux 与unix shell 编程指

Break、Continue、Return区别

1)break     直接跳出当前的循环,从当前循环外面开始执行,忽略循环体中任何其他语句和循环条件测试.他只能跳出一层循环,如果你的循环是嵌套循环,那么你需要按照你嵌套的层次,逐步使用break来跳出.     2)continue     也是终止当前的循环过程,但他并不跳出循环,而是继续往下判断循环条件执行语句.他只能结束循环中的一次过程,但不能终止循环继续进行. 3)return 语句可被用来使 正在执行分支程序返回到调用它方法.

【C语言】break,continue的区别

break: (1)永久结束循环,下一条执行的是正常结束循环时的下一条语句. (2)对于while语句,使用break,循环就会永久结束. (3)对于for语句,使用break,便终止不再执行for语句,开始执行for语句之后的语句. continue: (1)结束当前循环,结束后开始再判断是否满足循环条件. (2)对于while语句,使用continue,循环体内的剩余语句不再执行,而是开始下一条循环语句. (3)对于for语句,使用continue,则循环体内的剩余语句不再执行,开始判断fo

在c中break的使用

break语句通常用在循环语句和开关语句中.当break用于开关语句switch中时,可使程序跳出switch而执行switch以后的语句:如果没有break语句,则会从满足条件的地方(即与switch(表达式)括号中表达式匹配的case)开始执行,直到switch结构结束. 当break语句用于do-while.for.while循环语句中时,可使程序终止循环.而执行循环后面的语句,通常break语句总是与if语句联在一起.即满足条件时便跳出循环. 例: main() { int i=0; c

LeetCode-Word Break

Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words. For example, given s = "leetcode", dict = ["leet", "code"]. Return true because