阿里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; }
相关文章推荐
- 阿里2014校招笔试题(南大)——利用thread和sleep生成字符串的伪随机序列
- [阿里2015校招笔试]求字符串query和text最长连续字母序列的长度
- 阿里2014校招笔试题(南大)——利用thread和sleep生成字符串的伪随机序列
- 阿里校招笔试——给定一个字符串S和有效单词的字典D,请确定可以插入到S中的最小空格数,使得最终的字符串完全由D中的有效单词组成,并输出解。
- (网易2018校招笔试)[编程题] 字符串碎片
- 阿里2014校招笔试题(南大)——利用thread和sleep生成字符串的伪随机序列
- 前端 2018 届校招笔试面经【百度,阿里,腾讯,阿里文娱,携程,美团,拼多多】
- 今日头条2018校招笔试题之字符串的问题
- 阿里2014校招笔试题(南大)——利用thread和sleep生成字符串的伪随机序列
- 阿里2018校招客户端研发笔试之编程题
- (网易2018校招笔试)[编程题] 字符串碎片
- [网易2018校招java笔试题]字符串碎片(java语言实现)
- (网易2018校招笔试)[编程题] 字符串碎片
- 阿里2018校招笔试编程题
- 阿里2014校招笔试题(南大)——利用thread和sleep生成字符串的伪随机序列
- (网易2018校招笔试)[编程题] 游历魔法王国
- 【2018校招美团笔试编程题2】改考卷
- 田忌赛马 - 去哪儿2018校招哈尔滨在线笔试题 - 开发工程师
- 触宝科技2018校招笔试题
- 2018校招网易笔试——最长01交错子串