LeetCode - WordBreak2
来源:互联网 发布:mysql创建新的数据库 编辑:程序博客网 时间:2024/06/10 17:15
有意思的题目。。
其实可以用动态规划,但是输出稍微麻烦。
动规公式,设置a[i][j]为字符串从i到j的组合数
初始化a[i][j] = 0;
if(a[i][j] is a word)
a[i][j] = 1;
推导
for(int k=i;k<j;k++)
a[i][j] = a[i][j] + a[i][k] * a[k+1][j] ;
我这里用了递归,字符串str的word break,等于字符串str[0...i]的word break与字符串str[i+1....]的word break的组合。
如果用Trie来判定前缀的话,估计会更加快一点。
但是遇到一个案例aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab的时候我的算法也没辙,只好用个数组来记录哪些字符串是已经遍历失败过,不用再遍历。
import java.util.*;public class WordBreak2 {public ArrayList<String> wordBreak(String s, Set<String> dict) {Set<String> preDict = new HashSet<String>();for (String tmps : dict) {for (int j = 0; j < tmps.length()-1; j++)preDict.add(tmps.substring(0, j+1));}boolean[][] substrMap = new boolean[s.length()][s.length()];for(int i=0;i<s.length();i++)for(int j=0;j<s.length();j++)substrMap[i][j] = true;ArrayList<String> result = SubWordBreak(s, 0, dict, preDict, substrMap);return result;}public ArrayList<String> SubWordBreak(String s, int beg, Set<String> dict,Set<String> preDict, boolean[][] substrMap) {ArrayList<String> result = new ArrayList<String>();for (int j = beg; j < s.length(); j++) {if(j< s.length()-1 && substrMap[j+1][s.length()-1]==false)continue;String subStr = s.substring(beg, j + 1);if (dict.contains(subStr)) {if (j == s.length() - 1){result.add(subStr);break;}else {ArrayList<String> subRes = SubWordBreak(s, j + 1, dict,preDict,substrMap);if (subRes.size() > 0) {for (String tmp : subRes) {result.add(subStr + " " + tmp);}}}}if (!preDict.contains(subStr)) {break;}}if(result.size() == 0)substrMap[beg][s.length()-1]=false;return result;}public static void main(String[] args) {WordBreak2 wb = new WordBreak2();Set<String> dict = new HashSet<String>();dict.add("cat");dict.add("cats");dict.add("and");dict.add("sand");dict.add("dog");//dict.add("a");//dict.add("aa");//dict.add("aaa");//dict.add("aaaa");//dict.add("aaaaa");//dict.add("aaaaaa");//dict.add("aaaaaaa");//dict.add("aaaaaaaa");//dict.add("aaaaaaaaa");//dict.add("aaaaaaaaaa");//ArrayList<String> res = wb.wordBreak("catsanddog", dict);for (String tmps : res)System.out.println(tmps);}}
0 0
- LeetCode - WordBreak2
- LeetCode题解——wordBreak2
- 【DP】 wordbreak2 仿照神的代码
- leetcode
- [leetcode]
- LeetCode
- leetcode
- leetcode
- leetcode:
- leetcode:
- LeetCode
- leetcode
- LEETCODE
- leetcode
- leetCode
- leetcode
- [leetcode]
- LeetCode
- libevent的使用--socket异步编程
- 初探PHP的SQL注入攻击的技术实现以及预防措施
- CentOS下rdesktop安装和使用
- oracle多表查询
- Centos 中文输入法安装教程
- LeetCode - WordBreak2
- Ubuntu上安装Hadoop伪分布
- json的好处-新一代数据传输利器
- 代理模式
- 超简单的NDK单步调试方法
- Javascript实现带有关闭功能的漂浮图片
- Java高新技术第二篇:反射技术
- 理解shell命名空间扩展
- JAVA帮助文档全系列 JDK1.5 JDK1.6 JDK1.7 官方中英完整版下载