给你一个正整数数组 arr,请你找出一个长度为 m 且在数组中至少重复 k 次的模式。
模式 是由一个或多个值组成的子数组(连续的子序列),连续 重复多次但 不重叠 。 模式由其长度和重复次数定义。
如果数组中存在至少重复 k 次且长度为 m 的模式,则返回 true ,否则返回 false 。
解题思路:要利用好m和k,题目说不重叠,则模式串的长度肯定是m*k,双指针校验法,双层for循环,外层控制i,内层控制j,模式串的起点i肯定小于n-m*k,且j起始于i+m,且j <i+m*k
比较arr[j]和arr[j-m]是否相等,若相等则j++直至i+m*k或二者不等,则起点i++,开始重新寻找模式串。
若最终j==i+m*k,即 j 的位置为起点位置加模式串长度m*k(其实此时的j是加1 后发现不相等,break后的值,其实 j 是指在模式串的尾巴的后一位上),说明找到模式串,不等则false
1 class Solution { 2 public: 3 /* 双指针做法,i和j一直间隔模式长度m来一一校验,若相等j加1,直到两指针所指数不等,则跳出内层循环,外层循环i++
然后判断j是否到达了i+m*k的长度,若到达,说明之前模式匹配成功,没到达,小于,则false */ 4 bool containsPattern(vector<int>& arr, int m, int k) { 5 int n=arr.size(); 6 if(n<m*k)return false; 7 int i,j; 8 for(i=0;i<=n-m*k;i++){// 9 for(j=i+m;j<i+m*k;j++){//当跳出内循环后,i++后,即起点变化后,则j起点也要重置为i+m 10 if(arr[j]!=arr[j-m])break;//break只向外跳一层,i++后再进入内层for循环 11 } 12 if(j==i+m*k)return true;//j加到了和起点加模式串长度的大小 13 } 14 return false; 15 } 16 };