Leetcode---Word Break II

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


Have you been asked this question in an interview?

首先思考能不能用卡特兰数思路来做,后来发现不行,因为这样会导致大量的重复。比如catsanddog,
f("cat")*f("sanddog")的解空间就和f("catsand")*f("dog")重复,都有解"cat sand dog"。

所以思考去掉重复,假设s[i,j]是从位置i到位置j的s的子字符串,0<=i<=j<=s.size()-1;
又假设f(s, i, j)是s[i, j]为输入的解空间,那么
f(s, i, j)=西格玛(s[i,k]*f(s,k+1,j)), i <=k<j,
这里的 s[i,k]*f(s,k+1,j )指的是s[i,k]和f(s,k+1,j)解空间的每一个字符串相连接。
code如下:

  1. bool contain(unordered_set<string> &dict, string s)
  2.     {
  3.         unordered_set<string>::iterator ite = dict.find(s);
  4.         if(ite != dict.end())
  5.      return true;
  6.      else
  7.      return false;
  8.     }
  9.     vector<string> f(string s, unordered_set<string> &dict, int a, int b,vector<vector<bool>>& dp){
  10.         vector<string> result;
  11.         if(dp[a][b]){
  12.         if(contain(dict, s.substr(a,b-a+1))){
  13.             result.push_back(s.substr(a,b-a+1));
  14.         }
  15.         for(int k=a;k<b;k++){
  16.             if(contain(dict, s.substr(a,k-a+1)) && dp[k+1][b]){
  17.             vector<string> right=f(s,dict,k+1,b,dp);
  18.                 for(int j=0;j<right.size();j++){
  19.                         string tmp=s.substr(a,k-a+1)+" "+right[j];
  20.                         result.push_back(tmp);
  21.                 }
  22.             }
  23.         }
  24.         }
  25.         return result;
  26.     }
  27.     vector<string> wordBreak(string s, unordered_set<string> &dict) {
  28.         vector<vector<bool>> dp(s.size(),vector<bool>(s.size(),false));
  29.         for(int i=0;i<s.size();i++){
  30.             for(int j=i;j<s.size();j++){
  31.                 if(contain(dict,s.substr(i,j-i+1)))
  32.                     dp[i][j]=true;

  33.             }
  34.         }
  35.         for(int i=0;i<s.size();i++){
  36.             for(int j=i;j<s.size();j++){
  37.                 if(dp[i][j]==false){
  38.                 for(int k=i;k<j;k++){
  39.                     if(dp[i][k]&&dp[k+1][j]){
  40.                         dp[i][j]=true;
  41.                         break;
  42.                     }
  43.                 }
  44.             }
  45.         }
  46.         }
  47.         return f(s,dict,0,s.length()-1,dp);
  48.     }


<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(2) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值