您的位置:首页 > 其它

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

2017-08-25 21:44 302 查看
思路,类似于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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐