【Leetcode】Word Break II

本文深入探讨了信息技术领域的核心概念与应用实例,包括但不限于前端开发、后端开发、移动开发、游戏开发、大数据开发、开发工具、嵌入式硬件、嵌入式电路知识、嵌入式开发环境、音视频基础、音视频直播流媒体、图像处理AR特效、AI音视频处理、测试、基础运维、DevOps、操作系统、云计算厂商、自然语言处理、区块链、隐私计算、文档协作与知识管理、版本控制、项目管理与协作工具、有监督学习、无监督学习、半监督学习、强化学习、数据安全、数据挖掘、数据结构、算法、非IT技术、自动推理、人工神经网络与计算、自动驾驶、数据分析、数据工程等关键技术和实践。文章旨在为读者提供全面的技术知识与应用指导,促进信息技术领域的深入理解与创新应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【题目】

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"].

【代码】

class Solution {
public:
    vector<string> wordBreak(string s, unordered_set<string> &dict) {
      vector<string> vResult;
    vResult.clear();
    int len=s.length();
    if((0==len)||(0==dict.size()))return vResult;
    bool dp[len+1];
    vector<vector<string> >strArr;
    strArr.clear();
    memset(dp,false,sizeof(dp));
    for(int i=0;i<=len;++i){
        vector<string> v;
        v.clear();
        strArr.push_back(v);
    }
    dp[len]=true;
    for(int i=(len-1);i>=0;--i){
        vector<string> vec;
        vec.clear();
        for(unordered_set<string>::iterator it=dict.begin();it!=dict.end();++it){
            int size=(*it).length();
            if(((i+size)<=len)&&dp[i+size]&&((*it)==s.substr(i,size))){
                dp[i]=true;
                if((i+size)==len){
                    vec.push_back(*it);
                    continue;
                }
                if(strArr[i+size].size()>0){
                    for(int j=0;j<strArr[i+size].size();++j){
                        if(strArr[i+size][j]!="")vec.push_back((*it)+" "+strArr[i+size][j]);
                    }
                }
            }
        }
        if(vec.size()>0)strArr[i]=vec;
    }
    vResult=strArr[0];
    return vResult;
    }
};

【总结】

1.使用动态规划,和word break题一样,区别是要这次要记录下中间结果,以备需要时取。这里使用vector<vector<string> >保存。

2.思路是:从后往前扫描目标字符串s,记录下每个位置dp[i]值,如果s[i...len]可以用dict中的词表达,值为TRUE,否则为FALSE;同时vector<vector<string> >保存s[i...len]能用dict的单词表达的方式。扫描到s首字母的结果就是题目所需。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值