最大包含单词(c++)
题目:
给定一个字符串,输出其最大的包含单词个数以及所包含的单词。限制条件如下:
1.每份中包含的单词可以部分重叠。
2.当选用一个单词后,其第一个字母不能再用。例如字母串this中可包含this和is,选用this之后就不能包含th,或是以t开头的其他单词,因为以t开头的单词this已经包含在内了。
输入:给定字符串、字典单词个数 str、n;
接下来n行为字典单词。
输出:字符串包含的最大字典单词个数以及所包含的单词。
思路:(类似滑动窗口)
1、定义左窗口left,从头开始遍历,注意是遍历;
2、定义右窗口right,从left开始,到left+maxlen(字典中最长单词长度)为止,在left~right这一范围匹配单词;
3、承接1,正因为是遍历,每匹配到一个单词退出内部循环后只做left++。
代码:
#include <iostream> #include <string> using namespace std; const int N = 100; string dict[N]; // 记录字典单词 string s[N]; // 记录答案 string str; int n,maxlen; int cnt; // 最大包含数 int dic_max() // 返回字典中最长单词长度 { int a = dict[0].length(); for (int i = 1; i < n; ++i) if (dict[i].length() > a) a = dict[i].length(); return a; } void find() { int left = 0; while (left < str.length()) { for (int right = left; right < left + maxlen; ++right) { // right最大值为left+maxlen-1 string tmp = ""; int flag = 0; // 标志 for (int i = left; i <= right; ++i) // 范围 left~right tmp += str[i]; for (int i = 0; i < n; ++i) // 匹配字典单词 { if (tmp == dict[i]) { s[cnt++] = dict[i]; flag = 1; } } if (flag) break; // 匹配到单词,退出内部for } left++; // 之前说了 } } int main() { ios::sync_with_stdio(false); cin>>str>>n; for (int i = 0; i < n; ++i) cin>>dict[i]; maxlen = dic_max(); find(); printf("最大包含%d个单词,分别为\t:",cnt); for (int i = 0; i < cnt; ++i) cout<<s[i]<<" "; return 0; }
如:输入thisistheflowerofthedawn

其中重叠单词this包含了th、is两个,the包含th、he两个。

浙公网安备 33010602011771号