给定一个字符串 String s =
"leetcode"


dict =
["leet", "code"]
.

查看一下是够是字典中的词语组成。假设是返回true,否则返回false。

下边提供3种思路

1.动态算法

import java.util.HashSet;
import java.util.Set; public class WordBreak1 {
public static void main(String[] args) {
//"["a","aa","aaa","aaaa","aaaaa","aaaaaa","aaaaaaa","aaaaaaaa","aaaaaaaaa","aaaaaaaaaa"]
//String s="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab";
String s ="LeetCodea";
Set<String> dict = new HashSet<String>();
dict.add("Leet");
dict.add("Code");
dict.add("a");
System.out.println(wordBreak(s,dict));
}
public static boolean wordBreak(String s, Set<String> dict) {
boolean[] t = new boolean[s.length() + 1];
t[0] = true; // set first to be true, why?
// Because we need initial state for (int i = 0; i < s.length(); i++) {
// should continue from match position
if (!t[i])
continue;
for (String a : dict) {
int len = a.length();
int end = i + len;
if (end > s.length())
continue; if (t[end])
continue; if (s.substring(i, end).equals(a)) {
t[end] = true;
}
}
}
return t[s.length()];
}
}

2.普通算法(1)

import java.util.Set;

public class WorkBreak2 {
public boolean wordBreak(String s, Set<String> dict) {
return wordBreakHelper(s, dict, 0);
} public boolean wordBreakHelper(String s, Set<String> dict, int start) {
if (start == s.length())
return true; for (String a : dict) {
int len = a.length();
int end = start + len; // end index should be <= string length
if (end > s.length())
continue; if (s.substring(start, start + len).equals(a))
if (wordBreakHelper(s, dict, start + len))
return true;
}
return false;
}
}

3.普通算法(2)

import java.util.Set;

public class WordBreak3 {

	public static boolean wordBreak(String s, Set<String> dict) {
// input validation
// Base case
if (dict.contains(s))
return true;
else {
for (int i = 0; i < s.length(); i++) {
String sstr = s.substring(0, i);
if (dict.contains(sstr))
return wordBreak(s.substring(i), dict);
}
}
return false;
}
}

可是以上的算法有一个问题,就是遇到这样的情况。INPUT: "programcreek", ["programcree","program","creek"]. 无能为力。

大家讨论下吧?

Java Word Break(单词拆解)的更多相关文章

  1. [LeetCode] 139. Word Break 单词拆分

    Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, determine ...

  2. 139 Word Break 单词拆分

    给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,确定 s 是否可以被空格分割为一个或多个在字典里出现的单词.你可以假设字典中无重复的单词.例如,给出s = "leet ...

  3. LeetCode 139. Word Break单词拆分 (C++)

    题目: Given a non-empty string s and a dictionary wordDict containing a list of non-emptywords, determ ...

  4. [leetcode]139. Word Break单词能否拆分

    Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, determine ...

  5. Leetcode139. Word Break单词拆分

    给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词. 说明: 拆分时可以重复使用字典中的单词. 你可以假设字典中没有重复 ...

  6. [LeetCode] 140. Word Break II 单词拆分II

    Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, add space ...

  7. Word Break II 求把字符串拆分为字典里的单词的全部方案 @LeetCode

    这道题相似  Word Break 推断能否把字符串拆分为字典里的单词 @LeetCode 只不过要求计算的并不不过能否拆分,而是要求出全部的拆分方案. 因此用递归. 可是直接递归做会超时,原因是Le ...

  8. LeetCode 139. 单词拆分(Word Break)

    139. 单词拆分 139. Word Break

  9. word break II(单词切分)

    Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, add space ...

随机推荐

  1. python请求服务器图片并下载到本地磁盘

    >>> import os >>> os.getcwd() 'C:\\Python33' >>> os.chdir('E:\\python\\mm ...

  2. HTML+CSS+JS总结

    ==================HTML(超文本标记语言)========== <!DOCTYPE> 声明位于文档中的最前面的位置,处于 <html> 标签之前.此标签可告 ...

  3. 【JAVA练习】- 一个逻辑题

    打印 1 3    4 5   8    12 7   12   20   32 9    16  28    48   80  ..... 输入任意一个奇数,输出那一行的数据 第一种方法找到规律进行 ...

  4. 酷派改变者S1(C105/C105-6/C105-8) 解锁BootLoader 并刷入recovery root

    首先下载好工具链接:https://pan.baidu.com/s/1qZjOCUw 密码:u2dr 备用下载链接:https://pan.baidu.com/s/1pMlmAef 本篇教程教你如何傻 ...

  5. session 存入redis 或 memcache 的方法

      Session简介 session,中文经常翻译为会话,其本来的含义是 指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session.有时候我们 ...

  6. css单双行样式

    #random_box li:nth-child(odd) {//双行 background: #fff5c4; } #random_box li:nth-child(even) {//单行 back ...

  7. Uoj #274. 【清华集训2016】温暖会指引我们前行 LCT维护边权_动态最小生成树

    Code: 行#include<bits/stdc++.h> #define ll long long #define maxn 1000000 #define inf 100000000 ...

  8. linux系统下安装memcached

    检查libevent 首先检查系统中是否安装了libevent rpm -qa|grep libevent 如果安装了则查看libevent的安装路径,后续安装时需要用到 rpm -ql libeve ...

  9. 设计模式 第一天 UML图,设计模式原则:开闭原则、依赖倒转原则、接口隔离原则、合成复用原则、迪米特法则,简单工厂模式

    1 课程大纲 2 UML的概述 总结: UML unified model language 统一建模语言 一共有十种图: 类图 用例图 时序图 * 对象图 包图 组件图 部署图 协作图 状态图 (最 ...

  10. php第六讲

    继承和静态 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...