最大包含单词(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两个。

 

posted @ 2021-08-05 14:42  rainyMo  阅读(153)  评论(0)    收藏  举报