zoukankan      html  css  js  c++  java
  • Word Break II

    参考http://www.cnblogs.com/TenosDoIt/p/3385644.html#commentform

      1 #include <iostream>
      2 #include <unordered_set>
      3 #include <string>
      4 #include <array>
      5 
      6 using namespace std;
      7 
      8 class Solution {
      9 public:
     10     vector<string> wordBreak(string s, unordered_set<string> &dict)
     11     {
     12         // Note: The Solution object is instantiated only once and is reused by each test case.
     13         vector<string> result;
     14         if(dict.empty())
     15             return result;
     16         if (s.empty())
     17         {
     18             return result;
     19         }
     20         const int len = s.size();
     21         bool *canBreak = new bool [len]; //canBreak[i] = true 表示s[0~i]是否能break
     22         memset(canBreak, 0, sizeof(bool)*len);
     23         bool **pre = new bool *[len];//如果s[k..i]是字典中的单词,则pre[i][k]=true
     24         for(int i = 0; i < len; i++)
     25         {
     26             pre[i] = new bool[len];
     27             memset(pre[i], 0 , sizeof(bool)*len);
     28         }
     29 
     30         for(int i = 1; i <= len; i++)
     31         {
     32             if(dictContain(dict, s.substr(0, i)))
     33             {
     34                 canBreak[i-1] = true;
     35                 pre[i-1][0] = true;
     36             }
     37             if(canBreak[i-1] == true)
     38             {
     39                 for(int j = 1; j <= len - i; j++)
     40                 {
     41                     if(dictContain(dict,s.substr(i, j)))
     42                     {
     43                         canBreak[j+i-1] = true;
     44                         pre[j+i-1][i] = true;
     45                     }
     46                 }
     47             }
     48         }
     49         //return false;
     50         vector<int> insertPos;
     51         getResult(s, pre, len, len-1, insertPos, result);
     52         return result;
     53     }
     54 
     55     bool dictContain(unordered_set<string> &dict, string s)
     56     {
     57         unordered_set<string>::iterator ite = dict.find(s);
     58         if(ite != dict.end())
     59             return true;
     60         else return false;
     61     }
     62 
     63     //在字符串的某些位置插入空格,返回新字符串
     64     string insertBlank(string s,vector<int>pos)
     65     {
     66         string result = "";
     67         int base = 0;
     68         for(int i = pos.size()-1; i>=0; i--)
     69         {
     70             if(pos[i] == 0)continue;//开始位置不用插入空格
     71             result += (s.substr(base, pos[i]-base) + " ");
     72             base = pos[i];
     73         }
     74         result += s.substr(base, s.length()-base);
     75         return result;
     76     }
     77 
     78     //从前驱路径中构造结果
     79     void getResult(string s, bool **pre, int len, int currentPos,
     80         vector<int>insertPos,
     81         vector<string> &result)
     82     {
     83         if(currentPos == -1)
     84         {
     85             result.push_back(insertBlank(s,insertPos));
     86             //cout<<insertBlank(s,insertPos)<<endl;
     87             return;
     88         }
     89         for(int i = 0; i <= currentPos; i++)
     90         {
     91             if(pre[currentPos][i] == true)
     92             {
     93                 insertPos.push_back(i);
     94                 getResult(s, pre, len, i-1, insertPos, result);
     95                 insertPos.pop_back();
     96             }
     97         }
     98     }
     99 };
    100 
    101 int main(){
    102     string s = "catsanddog";
    103     unordered_set<string> dict;
    104     array<string, 5> myarray = {"cat", "cats", "and", "sand", "dog"};
    105     dict.insert(myarray.begin(), myarray.end());
    106     Solution sln;
    107     //cout << sln.wordBreak(s, dict) << endl;    
    108 
    109     vector<string> ret = sln.wordBreak(s,dict);
    110     for (vector<string>::iterator iter = ret.begin(); iter != ret.end(); iter++)
    111     {
    112         cout << *iter << endl;
    113     }
    114     
    115 }
  • 相关阅读:
    DYCom多平台聊天室Sample
    silverlight多人在线游戏示例
    设计模式之: 命令模式
    Vector
    flashBuilder加入AsDoc注释
    转:每个Flash开发者应该知道的事情
    flashBuilder无法调试:57%就不动了
    UML类图实例
    Dictionary
    Enterprise Architect使用(一)
  • 原文地址:https://www.cnblogs.com/chunlifang-luck/p/3565032.html
Copyright © 2011-2022 走看看