1566重复至少 K 次且长度为 M 的模式

    科技2022-07-20  88

    题目描述: 给你一个正整数数组 arr,请你找出一个长度为 m 且在数组中至少重复 k 次的模式。 模式 是由一个或多个值组成的子数组(连续的子序列),连续 重复多次但 不重叠 。 模式由其长度和重复次数定义。 如果数组中存在至少重复 k 次且长度为 m 的模式,则返回 true ,否则返回 false 。

    示例 1: 输入:arr = [1,2,4,4,4,4], m = 1, k = 3 输出:true 解释:模式 (4) 的长度为 1 ,且连续重复 4 次。注意,模式可以重复 k 次或更多次,但不能少于 k 次。

    示例 2: 输入:arr = [1,2,1,2,1,1,1,3], m = 2, k = 2 输出:true 解释:模式 (1,2) 长度为 2 ,且连续重复 2 次。另一个符合题意的模式是 (2,1) ,同样重复 2 次。

    示例 3: 输入:arr = [1,2,1,2,1,3], m = 2, k = 3 输出:false 解释:模式 (1,2) 长度为 2 ,但是只连续重复 2 次。不存在长度为 2 且至少重复 3 次的模式。

    示例 4: 输入:arr = [1,2,3,1,2], m = 2, k = 2 输出:false 解释:模式 (1,2) 出现 2 次但并不连续,所以不能算作连续重复 2 次。

    示例 5: 输入:arr = [2,2,2,2], m = 2, k = 3 输出:false 解释:长度为 2 的模式只有 (2,2) ,但是只连续重复 2 次。注意,不能计算重叠的重复次数。

    提示: 2 <= arr.length <= 100 1 <= arr[i] <= 100 1 <= m <= 100 2 <= k <= 100

    方法1: 主要思路: (1)直接暴力比较判断;

    class Solution { public: bool containsPattern(vector<int>& arr, int m, int k) { int pos=0; int len=arr.size()-m*k+1;//作为起始位置的终止范围 while(pos<len){ //判断当前位置是否满足情形 int index=pos; int cur_end=pos+(k-1)*m;//当前位置的终止位置 for(;index<cur_end;++index){ //若有一个不满足相等的条件,则直接跳出 if(arr[index]!=arr[index+m]){ break; } } //只有遍历到结尾,才能说明当前的子串满足条件 if(index==cur_end){ return true; } ++pos;//判断下一个位置 } return false; //跳出循环,说明没有找到满足要求的字符串,返回false } };
    Processed: 0.013, SQL: 8