Detect Pattern of Length M Repeated K or More Times
Description
https://leetcode.com/problems/detect-pattern-of-length-m-repeated-k-or-more-times/
Implementation
Sliding Window Technique
Iterate through possible starting positions
Check if a pattern of length
m
repeatsk
times consecutivelyTime Complexity: O(n * m * k)
Space Complexity: O(1)
C++
#include <vector>
#include <algorithm>
#include <functional>
#include <ranges>
class PatternValidator {
public:
bool validate(const std::vector<int>& arr, int start, int m, int k) {
for (int repeat = 1; repeat < k; ++repeat) {
int patternOffset = start + repeat * m;
if (!comparePatternSegments(arr, start, patternOffset, m)) {
return false;
}
}
return true;
}
private:
bool comparePatternSegments(const std::vector<int>& arr,
int firstSegment,
int secondSegment,
int m) {
return std::equal(
arr.begin() + firstSegment,
arr.begin() + firstSegment + m,
arr.begin() + secondSegment
);
}
};
class PatternMatcher {
public:
static bool containsPattern(const std::vector<int>& arr, int m, int k) {
if (arr.size() < m * k) return false;
return std::ranges::any_of(
std::views::iota(0, static_cast<int>(arr.size() - m * k + 1)),
[&](int start) {
return checkPatternAtIndex(arr, start, m, k);
}
);
}
private:
static bool checkPatternAtIndex(
const std::vector<int>& arr,
int start,
int m,
int k) {
PatternValidator validator;
return validator.validate(arr, start, m, k);
}
};
class Solution {
public:
bool containsPattern(vector<int>& arr, int m, int k) {
return PatternMatcher::containsPattern(arr, m, k);
}
};
Last updated