展示多条短语所需最少字符数求解及代码优化咨询
字符采购最小集问题
我们有一组不同的多字母短语,需要在墙上逐次展示其中一条。
每个字母都需要单独采购,因此我们希望求出能够展示所有短语所需的最少字符总数,以及具体需要采购的字符清单。
示例:要展示短语"Computer"和"Visual studio community",我们需要:
- c, o, m, p, u, t, e, r, v, i, s, a, l, s, u, d, i, o, m, u, n, i, t, y
- 共24个字符
输出结果c, o, m, p, u, t, e, r, v, i, s, a, l, s, u, d, i, o, m, u, n, i, t, y就是组成computer和visual studio community所需的最小字符集。程序逻辑如下:第一个短语的字符直接全部保留,展示第二个短语时优先复用已有字符,仅补充缺失部分。展示Visual studio community时只需补充v, i, s, a, l, s, u, d, i, o, m, u, n, i, t, y这些字符,因为可以复用computer中的u来拼visual,同理复用其中的t来拼studio。
如果输入新增单词Computer,输出不会变化,因为现有字符集合已经可以拼出该单词,无需额外采购字符;如果将输入的studio多加一个t改为visual sttudio community,输出就需要新增一个t,因为computer仅提供1个t,现在总共需要2个t,所以需要额外补充。
以上是完整题干,我已经写了如下实现程序,想请教是否有更简单的实现方式,运行速度不需要考虑。
#include <iostream> #include <string> #include <vector> #include <algorithm> using namespace std; int main() { vector<string> phrases = {/*0*/ "Hello world", /*1*/ "Lorem ipsum dolar sit amet", /*2*/ "This is a programming challenge"}; vector<char> letters; for (int i = 0; i < phrases.size(); i++) { string copyOfPhrases = phrases[i]; vector<char> copyOfLetters = letters; copyOfPhrases.erase(remove(copyOfPhrases.begin(), copyOfPhrases.end(), ' '), copyOfPhrases.end()); transform(copyOfPhrases.begin(), copyOfPhrases.end(), copyOfPhrases.begin(), ::tolower); for (int j = 0; j < copyOfPhrases.size(); j++) { int ok = 0; for (int k = 0; k < copyOfLetters.size(); k++) { if (copyOfPhrases[j] == copyOfLetters[k]) { ok += 1; } } if (ok == 0) { letters.push_back(copyOfPhrases[j]); } else { copyOfLetters.erase(find(copyOfLetters.begin(), copyOfLetters.end(), copyOfPhrases[j])); } } } for (int i = 0; i < letters.size(); i++) { cout << letters[i] << " "; } cout << endl << letters.size(); }
内容的提问来源于stack exchange,提问作者Iulian Iordache
相关产品推荐
相关产品推荐

