936 戳印序列

原题链接

题解:逆序思维

我们如果正着考虑戳印序列,那么题目会很复杂,但是如果我们倒着考虑,即最后按下的戳印位置一定和stamp一一对应,然后将该位置改为?后再取匹配,那么问题就容易解决了。

 

class Solution {
public:
    int n,m;
    int sum[1005],que[1005],bol[1005];
    vector<vector<int> > G;    //哪些位置的戳应在i位置是不匹配的
    vector<int> a;
    vector<int> movesToStamp(string stamp, string target) {
        n=target.size();
        m=stamp.size();
        int l=0,r=0;
        for (int i=0;i<n;i++) G.push_back(a);
        for (int i=0;i<n-m+1;i++){
            for (int j=0;j<m;j++){
                if (target[i+j]!=stamp[j]){
                    sum[i]++;    //不匹配的个数
                    G[i+j].push_back(i);   //i位置的戳应在i+j位置无法匹配
                }
            }
            if (sum[i]==0) que[r++]=i;   //全部匹配代表是最后按下的
        }
        while (l<r){
            int from=que[l++];
            for (int i=0;i<m;i++){
                if (bol[from+i]==0){   //防止重复位置的操作
                    for (auto &it : G[from+i]){
                       if (--sum[it]==0) que[r++]=it;
                    }
                    bol[from+i]=1;
                }
            }
        }
        if (r!=n-m+1) return a;  //如果没有对应答案返回空数组
        r--;
        while (r>=0){    //逆序一下
            a.push_back(que[r--]);
        }
        return a;
    }
};

 

posted @ 2024-02-27 16:16  黑屿白  阅读(26)  评论(0)    收藏  举报