139. Word Break

问题描述
Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, determine if s can be segmented into a space-separated sequence of one or more dictionary words. You may assume the dictionary does not contain duplicate words.
For example, given

s = “leetcode”,
dict = [“leet”, “code”].

Return true because “leetcode” can be segmented as “leet code”.

解题思路
该问题给了我们一个字符串s和一个字典dict,要求我们根据字典判断字符串s能否全部根据字典中的单词进行分割。我们可以这样思考:字符串s可以被全部分割,即组成字符串s的子字符串全部都在字典dict中,而判断子字符串是否在dict中,我们可以一个一个字符的判断,用一个bool类型的数组或者向量,向量或数组的长度为字符串s的长度加1,然后每一位初始设为false,第一位设为true。然后遍历没一个字符,如果该字符在dict中就将对应位置的数组设为true,每一位的判断先要满足前一位为true的条件,然后再进行判断,最后得出的字符串s长度的位置为真即代表可以完全分割。

代码展示

#include<iostream>
#include<stdlib.h>
#include<stdio.h> 
#include<string>
#include<vector>
#include<algorithm>
using namespace std;

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        int size = s.size();
        vector<bool> dp(size + 1, false);
        dp[0] = true;
        for(int i = 1; i <= size; i++){
            for(int j = 0; j < i; j++){
                if(dp[j]){
                    vector<string>::iterator re = find( wordDict.begin(), wordDict.end(),  s.substr(j, i - j)); 
                    if (re != wordDict.end()) 
                        dp[i] = true;
                }
            }
        }
        return dp[size];
    }
};

int main(){
    string s;
    cout<<"请输入原始字符串s:";
    cin>>s;
    cout<<"请输入字典向量的额元素个数n:";
    vector<string> wordDict;
    int n;
    string a;
    cin>>n;
    while(n--){
        cin>>a;
        wordDict.push_back(a);
    }
    Solution solution;
    bool result=solution.wordBreak(s, wordDict);
    if(result == true) cout<<"True"<<endl;
    else cout<<"False"<<endl;
    return 0;
} 

运行结果展示
这里写图片描述
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值