题解 | #单词拆分(二)#

单词拆分(二)

https://www.nowcoder.com/practice/bb40e0aae84a4491a35f93b322516cb5?tpId=196&tqId=39340&rp=1&ru=/exam/oj&qru=/exam/oj&sourceUrl=%2Fexam%2Foj%3Ftab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D196%26page%3D1%26search%3Dnc182&difficulty=undefined&judgeStatus=undefined&tags=&title=nc182

题意:
        给定一个字符串和一个字符串数组,在字符串的任意位置添加空格后得到的字符串集合是给定字符串数组的子集,请输出可能的拆分方案。
        对答案按字典序排序后输出,空格视为一个字符。


方法一:
递归

思路:
    首先,用无序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+" ");
            }
        }
    }
}
	
时间复杂度:
空间复杂度:








全部评论
以下内容来自chatGPT3.5 该算法是一种暴力搜索的方法,对于给定的字符串和字典,通过深度优先搜索算法遍历所有可能的词语组合,然后判断每个组合是否在给定的字典中出现过,将符合条件的组合添加到结果列表中。 虽然该算法的时间复杂度较高,但在小型数据集上可以得到较好的运行效果。不过,在大型的数据集上,该算法的性能会变得非常低下,因此通常需要使用更加高效的算法,如使用字典树等数据结构来进行优化。 优化: 如果要优化给定字符串 str 在字典 dict 中的分割方式的算法,可以使用动态规划(DP)算法来减少重复计算,降低时间复杂度。 具体地,根据 DP 的思想,我们可以定义状态数组 dp,其中 dp[i] 表示字符串 str 的前 i 个字符是否可以被字典中的单词表示。接下来,我们需要推导状态转移方程,即如何从前面的状态推导出新的状态。 对于 dp[i],可以遍历所有 j
点赞 回复 分享
发布于 2023-03-23 23:57 上海
不错!
点赞 回复 分享
发布于 2022-09-02 10:34 贵州

相关推荐

勤劳的鲸鱼在okr拆解:没有别的选择就去吧,有实习和没实习找工作是天上地下
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客企业服务