1. 程式人生 > 實用技巧 >85單詞拆分(139)

85單詞拆分(139)

作者: Turbo時間限制: 1S章節: 動態規劃

晚於: 2020-09-02 12:00:00後提交分數乘係數50%

截止日期: 2020-09-09 12:00:00

問題描述 :

給定一個非空字串 s 和一個包含非空單詞列表的字典 wordDict,判定 s 是否可以被空格拆分為一個或多個在字典中出現的單詞。

說明:

拆分時可以重複使用字典中的單詞。

你可以假設字典中沒有重複的單詞。

示例 1:

輸入: s = "leetcode", wordDict = ["leet", "code"]

輸出: true

解釋: 返回 true 因為 "leetcode" 可以被拆分成 "leet code"。

示例 2:

輸入: s = "applepenapple", wordDict = ["apple", "pen"]

輸出: true

解釋: 返回 true 因為 "applepenapple" 可以被拆分成 "apple pen apple"。

注意你可以重複使用字典中的單詞。

示例 3:

輸入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]

輸出: false

輸入說明 :

第一行輸入字串s

第二行輸入字典 wordDict中單詞的數目n

第三行輸入n個字串,以空格分隔

輸出說明 :

輸出true或false

輸入範例 :

輸出範例 :

#include <iostream>
#include <vector>
#include <string> 
#include <unordered_set>
using namespace std;
class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) 
    {
        vector<bool
> dp(s.size()+1,false);//dp[i]表示s的前i個字元能否被拆分 unordered_set<string> ma(wordDict.begin(),wordDict.end()); dp[0]=true; for(int i=1;i<=s.size();i++) { for(int j=0;j<i;j++) { if(dp[j]&&ma.find(s.substr(j,i-j))!=ma.end()) { dp[i]=true; break; } } } return dp[s.size()]; } }; int main() { string s,str; vector<string> words; int n; cin>>s; cin>>n; for(int i=0; i<n; i++) { cin>>str; words.push_back(str); } bool res=Solution().wordBreak(s,words); if (res) cout<<"true"; else cout<<"false"; return 0; }