题解:逆序思维
我们如果正着考虑戳印序列,那么题目会很复杂,但是如果我们倒着考虑,即最后按下的戳印位置一定和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; } };
标签:int,戳印,stamp,vector,序列,1005,936 From: https://www.cnblogs.com/purple123/p/18037109