[LeetCode] Word Break II

来源:互联网 发布:js控制div左右移动 编辑:程序博客网 时间:2024/06/18 08:33

leetcode 原题

这个题可以用dfs做,思路简单,但是也可以用dp做。

Dp的做法基于Word Break I

也很费空间,每次的结果都要存起来,以免后面要用。

存到最后一个结果的时候,那就是题目要返回的值,也就是多少种词的情况。

至于最后那个原封不动的word break I的代码,是为了一个超大的全是aaaaaaaaaa...aaaa的集合量身打造的。因为如果不能break,我们就不费事搞了,直接返回。

    public List<String> wordBreak(String s, Set<String> dict) {        int n=s.length();    boolean[] dp=new boolean[n+1];    dp[0]=true;     List<List<String>> words = new ArrayList<List<String>>();           for (int i = 0; i <= n; i++)               words.add(new ArrayList<String>());           words.get(0).add("");      if(!wordBreakI(s,dict)) return new ArrayList<String>();        for(int i=1;i<=n;i++){        for(int j=0;j<i;j++){            String temp=s.substring(j,i);            if(dp[j] && dict.contains(temp)){                dp[i]=true;                for (String str : words.get(j)) {                          if (str.equals(""))                              words.get(i).add(String.format("%s", temp));                          else                              words.get(i).add(String.format("%s %s", str, temp));                          }              }        }    }            return words.get(n);    }         public boolean wordBreakI(String s, Set<String> dict) {        //dp        int n= s.length();        boolean[] dp=new boolean[n+1];        dp[0]=true;        for(int i=1;i<=n;i++){            for(int j=0;j<=i;j++){                if(dp[j] && dict.contains(s.substring(j,i))){                    dp[i]=true;                }            }        }        return dp[n];    }


0 0
原创粉丝点击