Leetcode - Word Break

**
Question:

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".
**

My code:

import java.util.Set;

public class Solution {
    public boolean wordBreak(String s, Set<String> wordDict) {
        boolean[] isBreakUp = new boolean[s.length() + 1];
        isBreakUp[0] = true;
        for (int i = 1; i < s.length() + 1; i++) {
            for (int j = 0; j < i; j++) {
                if (isBreakUp[j] && wordDict.contains(s.substring(j, i)))
                    isBreakUp[i] = true;
            }
        }
        return isBreakUp[s.length()];
    }
}

My test result:

Paste_Image.png

这次作业是挺带劲的。因为我没有做出来。。后来一查,恩,是Medium。那就不难过啦。
说实话,这次作业还是做出来的。但是用的递归,用时过长了,就测试不出来了。
然后我就看了网上大神写的代码。没话说。怎么总结呢?总结不出来。这就是一种想法。按我说,就是步步为营,并且,同时,保证不会重复判断之前已经判断过的情况。我看了网上评论,说这东西就是 dynamic programming. 实在太累了。明天回来一定好好查下,然后总结到这里。

然后,展示下我自己写的递归版代码:

public class Solution {
    public boolean wordBreak(String s, Set<String> wordDict) {
        return this.isBreakUp(s, wordDict, 0, s.length());
    }
    
    private boolean isBreakUp(String s, Set<String> wordDict, int head, int length) {
        if (head == length)
            return true;
        for (int i = head; i < s.length(); i++) {
            if (wordDict.contains(s.substring(head, i + 1)))
                if (isBreakUp(s.substring(i + 1, s.length()), wordDict, i + 1, length))
                    return true;
                else
                    continue;
            else
                continue;
        }
        return false;
    }
}

这个递归我觉得写得还是挺不错的。为什么会超时呢?很明显,因为有很多情况,我之前已经判断过了,之后会继续重复判断。所以必须要设标志位来避免重复判断。

**
总结:
Dynamic Programming:网上又叫做,动态规划。我不是很理解。明天上网查了再说。
**

说好的一天至少一道题目。今天别看我现在凌晨2:43才提交。其实23:30就写好了。
今天早上就去了学校复习。然后对C++有了更深层次的理解。
这个也是明天必须得总结的。如何用C来实现面向对象编程。其实C中就含有向上转型和向下转型的特点,就是结构体指针和void指针的配合。
然后,我也终于明白了模板和继承是完全不同的。比如,模板是静态的,是编译时候完成的。而继承是动态的,是运行时候动态绑定的。明天总结。
一个小疑问,如果谁正好看到了这篇文章,又正好懂,万望求教。
**
Java中是不是只有继承,没有模板这种概念?模板是不是函数编程特有的概念?
**

C++复习剩下的就是一块自己一直很懂的地方,函数式编程。
所以明天也得查一下什么叫做函数编程,还有 λ-expression.
然后今天学习了电气上面的一些知识。觉得好牛逼。。。power application 原来也已经和计算机紧密结合到这个地步了。
单相不可控整流器
三相不可控整流器
单相可控整流器
三相可控整流器
overlap现象。。。。
这些就不总结了。感觉还是挺牛逼的。
明天总结下,
动态规划,函数编程,模板和继承,C实现面向对象。

累死了累死了。回来写代码到23:30,又接着写报告到现在。每次交报告,都是看出人性劣根性的最好机会。有些人就想混,比如我。有些人就是不肯给。有些人不肯给但又不想直接表现出来,就会采取各种方式搪塞过去。
Anyway, Good luck, Richardo!

My code:

public class Solution {
    public boolean wordBreak(String s, Set<String> wordDict) {
        if (wordDict.contains(s)) {
            return true;
        }
        int n = s.length();
        boolean[] flag = new boolean[n + 1];
        flag[0] = true;
        for (int i = 1; i < n + 1; i++) {
            for (int j = 0; j < i; j++) {
                if (flag[j] && wordDict.contains(s.substring(j, i))) {
                    flag[i] = true;
                    break;
                }
            }
        }
        
        return flag[n];
    }
}

这个是DP的解法。复杂度是 O(n ^ 2)

然后发现还有种解法是 BFS

My code:

public class Solution {
    public boolean wordBreak(String s, Set<String> wordDict) {
        if (wordDict.contains(s)) {
            return true;
        }
        int n = s.length();
        Queue<Integer> q = new LinkedList<Integer>();
        Set<Integer> isVisited = new HashSet<Integer>();
        q.offer(0);
        while (!q.isEmpty()) {
            int currIndex = q.poll();
            for (int i = currIndex + 1; i <= s.length(); i++) {
                if (isVisited.contains(i)) {
                    continue;
                }
                else if (wordDict.contains(s.substring(currIndex, i))) {
                    if (i == s.length()) {
                        return true;
                    }
                    else {
                        q.offer(i);
                        isVisited.add(i);
                    }
                }
            }
        }
        
        return false;
    }
}

reference:
https://discuss.leetcode.com/topic/2545/a-solution-using-bfs/5

每个节点都是在string s 中的 position, 边是 dictionary 里面的string
如果position0 + word1 --> position5
那么就是两个结点,0 and 5,中间有一条边,就是这个word

这道题目让我想起了另外一道题目: Jump game
但是不同。
那道题目, nums[i] + i 是下一步可以达到的最大位置,但是在这个位置之前的位置,也都是可以达到的。
而这道题目,在这之前的位置,并不能达到。
所以这道题目可以用BFS来解,而Jump game 不行。

另外,对已经确定可以达到的结点,把他们放入set中,这样以后就不会重复加入到队列里面去导致重复访问了。

Anyway, Good luck, Richardo! -- 09/05/2016

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容