区间最小覆盖

区间最小覆盖:

对于字符串s,给出若干个字符串t,问至少要多少个t,能够将s全部覆盖,t可以重复覆盖s

string s;
struct segment{
    int l, r;
    int id;
    bool operator < (const segment& t) const
    {
        if (l != t.l) return l < t.l;
        return r < t.r;
    }
}seg[N];//存放子区间的id和在s上的左右端点,注意区间需要sort排序

//区间覆盖部分
sort(seg + 1, seg + 1 + cnt);//cnt表示子区间的个数
bool flag = false;
int start = 1, ed = s.size();//start在每次找到需要加入的区间时更新
vector<segment> ans;//ans存放结果的l,r,id
for (int i = 1; i <= cnt; i++){
    int j = i, r = -INF;
    int index = -1;
    while (j <= cnt && seg[j].l <= start) {
        if (seg[j].r > r) {
            r = max(r, seg[j].r);
            index = j;
        }
        j++;
    }
    if (r < start) break;
    start = r + 1, i = j - 1;
    ans.push_back({ seg[index].l, seg[index].r,seg[index].id});
    if (r >= ed)
    {
        flag = true;
        break;
    }
}

Last updated