85單詞拆分(139)
阿新 • • 發佈:2020-09-11
作者:
晚於: 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; }