Word Break

来源:互联网 发布:关键词快速排名软件 编辑:程序博客网 时间:2024/05/22 10:29

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

1. DP,注意边界

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

2. memorization, top-bottom

维护一个数组,记录该element到最后的字符可不可以break。-1表示没有visit过,0表示不可以break, 1表示可以break

public class Solution {    static int[] canBreak;    public static boolean wordBreak(String s, Set<String> dict) {        canBreak = new int[s.length()+1];        for (int i = 0; i < s.length(); i++) {            canBreak[i] = -1;        }        canBreak[s.length()] = 1;        return helper(s, dict, 0);    }        static boolean helper(String s, Set<String> dict, int start) {        if (start == s.length()) {            return true;        }        for(int i = start+1; i <= s.length(); i++) {            if (dict.contains(s.substring(start, i))) {                if (canBreak[i] == 0) {                    continue;                } else if (canBreak[i] == 1) {                    return true;                } else if (canBreak[i] == -1) {                    boolean breakable = helper(s, dict, i);                    if (breakable) {                        canBreak[i] = 1;                        return true;                    } else {                        canBreak[i] = 0;                        continue;                    }                }            }        }        return false;    }}


3.  完全递归超时:

    public boolean wordBreak(String s, Set<String> dict) {        if (s.isEmpty()) {            return true;        }        for(int i = 1; i <= s.length(); i++) {            if (dict.contains(s.substring(0, i)) && wordBreak(s.substring(i), dict)) {                return true;            }        }        return false;    }

0 0
原创粉丝点击