题目:3034. 匹配模式数组的子数组数目 I
思路:先处理出nums数据,将其变为含有-1、0、1的数组
方法一:用两层for循环来找出符合要求的子数组,时间复杂度为0(nm)
class Solution {
public:
int countMatchingSubarrays(vector<int>& nums, vector<int>& pattern) {
int n=nums.size(),m=pattern.size();
for(int i=0;i+1<n;i++){
if(nums[i]<nums[i+1]) nums[i]=1;
else if(nums[i]==nums[i+1]) nums[i]=0;
else nums[i]=-1;
}
int ans=0;
for(int i=0;i<n;i++){
bool flag=1;
for(int j=0;j<m;j++){
if(pattern[j]!=nums[i+j]){
flag=0;
break;
}
}
if(flag) ans++;
}
return ans;
}
};
方法二:KMP算法。(KMP模板题) acwing 831. KMP字符串,时间复杂度0(n+m)
class Solution {
public:
int countMatchingSubarrays(vector<int>& nums, vector<int>& pattern) {
int n=nums.size(),m=pattern.size();
for(int i=0;i+1<n;i++){
if(nums[i]<nums[i+1]) nums[i]=1;
else if(nums[i]==nums[i+1]) nums[i]=0;
else nums[i]=-1;
}
vector<int> p(m,-1);
for(int i=1,j=-1;i<m;i++){
while(j!=-1&&pattern[j+1]!=pattern[i]) j=p[j];
if(pattern[j+1]==pattern[i]) j++;
p[i]=j;
}
int ans=0;
for(int i=0,j=-1;i<n;i++){
while(j!=-1&&pattern[j+1]!=nums[i]) j=p[j];
if(pattern[j+1]==nums[i]) j++;
if(j==m-1){
ans++;
j=p[j];
}
}
return ans;
}
};