题意:
给定一个字符串和一个字符串数组,在字符串的任意位置添加空格后得到的字符串集合是给定字符串数组的子集,请输出可能的拆分方案。
对答案按字典序排序后输出,空格视为一个字符。
方法一:
递归
思路:首先,用无序map实现判断某字符串是否存在的作用。
然后,按照以下树形图解递归遍历字符串;
最后,返回答案即可。
class Solution { public: unordered_map<string,int> mp;//判断某字符串是否存在 int len; vector<string> res; vector<string> wordDiv(string s, vector<string>& dic) { int n=dic.size(); len=s.size(); for(int i=0;i<n;i++){//初始化 mp[dic[i]]=1; } dfs(s,0,"");//递归 return res; } void dfs(string s,int st,string str){ if(len==st){//递归结束条件 res.push_back(str.substr(0,str.size()-1)); return; } string x=""; for(int i=st;i<len;i++){//循环遍历 x+=s[i]; if(mp.count(x)){//如果存在该字符串,则递归 dfs(s,i+1,str+x+" "); } } } };
时间复杂度:空间复杂度:
方法二:
java
思路:同方法一思路相同,java实现。
import java.util.*; public class Solution { HashMap mp=new HashMap<String,Integer>();//判断某字符串是否存在 int len; Vector<String> res=new Vector<String>(); public String[] wordDiv (String s, String[] dic) { int n=dic.length; len=s.length(); for(int i=0;i<n;i++){//初始化 mp.put(dic[i],1); } dfs(s,0,"");//递归 int m=res.size(); String[] ans=new String[m]; for(int i=0;i<m;i++){ ans[i]=res.get(i); } return ans; } void dfs(String s,int st,String str){ if(len==st){//递归结束条件 res.add(str.substring(0,str.length()-1)); return; } String x=""; for(int i=st;i<len;i++){//循环遍历 x+=s.charAt(i); if(mp.containsKey(x)){//如果存在该字符串,则递归 dfs(s,i+1,str+x+" "); } } } }
时间复杂度:空间复杂度: