阿里校招笔试——给定一个字符串S和有效单词的字典D,请确定可以插入到S中的最小空格数,使得最终的字符串完全由D中的有效单词组成,并输出解。
2017-08-25 21:12
1786 查看
给定一个字符串S和有效单词的字典D,请确定可以插入到S中的最小空格数,使得最终的字符串完全由D中的有效单词组成,并输出解。
如果没有解则应该输出n/a
例如
输入
S = "ilikealibaba"
D = ["i", "like", "ali", "liba", "baba", "alibaba"]
Example Output:
输出
"i like alibaba"
解释:
字符串S可能被字典D这样拆分
"i like ali baba"
"i like alibaba"
很显然,第二个查分结果是空格数最少的解。
AC代码如下
如果没有解则应该输出n/a
例如
输入
S = "ilikealibaba"
D = ["i", "like", "ali", "liba", "baba", "alibaba"]
Example Output:
输出
"i like alibaba"
解释:
字符串S可能被字典D这样拆分
"i like ali baba"
"i like alibaba"
很显然,第二个查分结果是空格数最少的解。
AC代码如下
#include <iostream> #include <set> #include <string> #include <vector> using namespace std; int fun(string str1, string str2, int a) { int count = 0; int i = a; int j = 0; while (i < str1.size() && j < str2.size() && str1[i] == str2[j]) { count++; i++; j++; } if (((i==str1.size())&&(j==str2.size())) || j == str2.size()) return count; return 0; } void mincut(const string& str, const set<string>& dict) { vector<string> res; if (str.empty() || dict.empty()) { cout << "n/a" << endl; return; } int i = 0; for (; i < str.size();i++) { char c = str[i]; set<string>::iterator it = dict.begin(); for (; it != dict.end(); it++) { if ((*it)[0] == c) break; } int maxlen = 0; while (it != dict.end() && (*it)[0] == c) { int len = fun(str, *it, i); if (maxlen < len) maxlen = len; it++; } if (maxlen == 0) { cout << "n/a" << endl; return; } string temp = str.substr(i, maxlen); // cout << temp << " "; res.push_back(temp); i += maxlen-1; } if (i == str.size()) { for (auto x : res) cout << x << " "; cout << endl; } else cout << "n/a" << endl; } int main(int argc, const char * argv[]) { string strS; string dictStr; int nDict; set<string> dict; cin >> strS; cin >> nDict; for (int i = 0; i < nDict; i++) { cin >> dictStr; dict.insert(dictStr); } //for (auto x : dict) // cout << x << " "; mincut(strS, dict); return 0; }
相关文章推荐
- 2018阿里校招笔试——给定一个字符串S和有效单词的字典D,请确定可以插入到S中的最小空格数,使得最终的字符串完全由D中的有效单词组成,并输出解。
- 给定一个字符串s和一个单词dict的字典,确定s是否可以分割成一个或多个字典单词的空格分隔的序列。 s ="leetcode", dict =["leet", "code"].
- 给定一个字符串s和一个单词dict的字典,在s中添加空格来构造一个句子,其中每个单词都是有效的字典单词。
- 给定一个字符串列表,找出单词中最长单词,可以用l列表中的其他单词一次构建一个字符。返回具有最小字典顺序的最长单词。
- 给定一个只包含小写字母的字符串,删除重复的字母,每个字母只出现一次。在所有结果中,输出字典顺序最小的。
- 一个只由字母数字字符和破折号组成的字符串S. 该字符串被N个破折号分成N + 1个组。 给定数字K,使得每个组包含完全K个字符,除了第一个组可能少于K
- 给定一个字符串a,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长? 输出需要删除的字符个数。
- 给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。
- 腾讯 2017 暑假实习生编程题(一):给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。
- 2015蘑菇街笔试题——给定一个英文单词的字符串,按照英文单词的顺序反转输出
- 对于一个n位正整数a,去掉其中任意k(k<=n)个数字后,剩下的数字按原次序排列可以组成一个新的正整数。设计一个删数算法,使得剩下的数字组成的正整数最小。例如,a=13243221,k=5,输出:12
- 给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。
- 【C++】用栈实现倒序输出一个字符串(可以带空格)
- 给定两个字符串和一个字典,从头到尾找到最短变换序列的长度,使得:一次只能改变一个字符每个中间词必须存在于字典中
- 谷歌笔试题--给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
- 给定一个字符串,里面用空格分开为多个(>=6)部分组合,如:01 02 03 04 05 06 07 …… 写一个函数返回任意6个组合的字符串: 输出格式实例: 01 02 03 04 05 06 0
- 8由空格和字母组成的字符串,输出最长单词
- 空格替换 请编写一个方法,将字符串中的空格全部替换为“%20”。假定该字符串有足够的空间存放新增的字符,并且知道字符串的真实长度(小于等于1000),同时保证字符串由大小写的英文字母组成。 给定一
- 编写一个程序,输入一串不超过60个字符组成的且不包含换行符的字符串,将字符串中的A到Z的字母按英文字典字母顺序重新排列,排列后的单词的长度要与原始句子中的长度相同,并且要求只对A到Z的字母重新排列,其
- poj1159 —— 一个字符串,求最少插入几个字符可以组成回文