阿里2018校招内推笔试题-字符串切分

版权声明:本文为博主原创文章,欢迎大家交流讨论。 https://blog.csdn.net/vonmax007/article/details/77587195

思路,类似于LeetCode Word Break II,参考之后计算空格数量就行。

// Ali02.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <list>
#include <stack>
#include <map>
#include <queue>
#include <set>
#include <unordered_set>
#include <algorithm>
using namespace std;

class Solution
{
public:
 vector<string> wordBreak(string s, unordered_set<string> &dict) 
 {
  vector<bool> f(s.length() + 1, false);
  vector<vector<bool> > prev(s.length() + 1, vector<bool>(s.length()));
  f[0] = true;
  for (size_t i = 1; i <= s.length(); ++i) 
  {
   for (int j = i - 1; j >= 0; --j) {
    if (f[j] && dict.find(s.substr(j, i - j)) != dict.end()) 
    {
     f[i] = true;
     prev[i][j] = true;
    }
   }
  }
  vector<string> result;
  vector<string> path;
  gen_path(s, prev, s.length(), path, result);
  return result;
 }
private:
 // DFS
 void gen_path(const string &s, const vector<vector<bool> > &prev,
  int cur, vector<string> &path, vector<string> &result) 
 {
  if (cur == 0) 
  {
   string tmp;
   for (auto iter = path.crbegin(); iter != path.crend(); ++iter)
    tmp += *iter + " ";
   tmp.erase(tmp.end() - 1);
   result.push_back(tmp);
  }
  for (size_t i = 0; i < s.size(); ++i) 
  {
   if (prev[cur][i]) 
   {
    path.push_back(s.substr(i, cur - i));
    gen_path(s, prev, i, path, result);
    path.pop_back();
   }
  }
 }
};
int CountW(string & str)
{
 int count = 0;
 for (int i = 0;i < str.size();++i)if (str[i] == ' ')++count;
 return count;
}
 void mincut(const string& str, const set<string>& dict)
{
 string s = str;
 unordered_set<string> dictt;
 set<string >::iterator it = dict.begin();
 for (;it != dict.end();++it)dictt.insert(*it);




 Solution so;
  vector<string> result = so.wordBreak(s, dictt); 

 if (result.size() == 0)
  {
   cout << "n/a";
   exit(0);
  } 

 vector<string> ::iterator rt = result.begin();
  string out = result.front();
  int outB = 50000;
  for (;rt != result.end();++rt)
  {
   int cw = CountW(*rt);
   if (cw < outB)
   {
    outB = cw;
    out = *rt;
   }
  } 

 cout << out;
 } 


 int main(int argc, const char * argv[])
 {
  ifstream fin("file.txt"); 

 string strS;
  string dictStr;
  int nDict;
  set<string> dict; 

 fin >> strS;
 fin >> nDict;
  for (int i = 0; i < nDict; i++)
  {
   fin >> dictStr;
   dict.insert(dictStr);
  }
  mincut(strS, dict); 

 return 0;
 }

猜你喜欢

转载自blog.csdn.net/vonmax007/article/details/77587195
今日推荐