Word Break II Java

来源:互联网 发布:java开源web项目小型 编辑:程序博客网 时间:2024/05/16 06:26

Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word.

Return all such possible sentences.

For example, given
s = "catsanddog",
dict = ["cat", "cats", "and", "sand", "dog"].

A solution is ["cats and dog", "cat sand dog"].

Have you been asked this question in an interview?

 NP-problem again, Time: depend on size of result 
    Solution#1: brute force of Recursive-loop, The appraoch is pretty
    similar with N-Queens problem
    Maintain a result List, traverse all the sub-String list
    Calling recursion iff dict contain currently String(word)


public static ArrayList<String> wordBreak(String s, Set<String> dict) {        ArrayList<String> res=new ArrayList<String>();        if(s==null || s.length()==0) return res;        //We need to determine the word is valid or not before break in order to AC in LeetCode        if(wordBreakCheck(s,dict)){            helper(s,dict,0,"",res);            return res;        }else{            return res;        }    }    private static void helper(String s, Set<String> dict, int index, String curData, ArrayList<String> res){        int len=s.length();        //completed a valid word break case        if(index>=len){            res.add(curData);            return;        }        StringBuilder str=new StringBuilder();        for(int i=index;i<len;i++){            str.append(s.charAt(i));            if(dict.contains(str.toString())){                String newCurData=curData.length()>0?curData+" "+str.toString():str.toString();                //recursive call: increasing index by i+1 && update curData with newCurData                helper(s,dict,i+1,newCurData,res);            }        }    }    public static boolean wordBreakCheck(String s, Set<String> dict) {        if(s==null || s.length()==0) return true;        int len=s.length();        boolean res[]=new boolean[len+1];        //initial res[0]        res[0]=true;        for(int i=0;i<len;i++){            StringBuilder tempStr=new StringBuilder(s.substring(0,i+1));            for(int j=0;j<=i;j++){                if(res[j] && dict.contains(tempStr.toString())){                    res[i+1]=true;                    break;                }                tempStr.deleteCharAt(0);            }        }        return res[len];    }


0 0