Welcome to Subscribe On Youtube

3456. Find Special Substring of Length K

Description

You are given a string s and an integer k.

Determine if there exists a substring of length exactly k in s that satisfies the following conditions:

  1. The substring consists of only one distinct character (e.g., "aaa" or "bbb").
  2. If there is a character immediately before the substring, it must be different from the character in the substring.
  3. If there is a character immediately after the substring, it must also be different from the character in the substring.

Return true if such a substring exists. Otherwise, return false.

 

Example 1:

Input: s = "aaabaaa", k = 3

Output: true

Explanation:

The substring s[4..6] == "aaa" satisfies the conditions.

  • It has a length of 3.
  • All characters are the same.
  • The character before "aaa" is 'b', which is different from 'a'.
  • There is no character after "aaa".

Example 2:

Input: s = "abc", k = 2

Output: false

Explanation:

There is no substring of length 2 that consists of one distinct character and satisfies the conditions.

 

Constraints:

  • 1 <= k <= s.length <= 100
  • s consists of lowercase English letters only.

Solutions

Solution 1: Two Pointers

The problem essentially asks us to find each segment of consecutive identical characters and then determine if there exists a substring of length $k$. If such a substring exists, return $\textit{true}$; otherwise, return $\textit{false}$.

We can use two pointers $l$ and $r$ to traverse the string $s$. When $s[l] = s[r]$, move $r$ to the right until $s[r] \neq s[l]$. At this point, check if $r - l$ equals $k$. If it does, return $\textit{true}$; otherwise, move $l$ to $r$ and continue traversing.

The time complexity is $O(n)$, where $n$ is the length of the string $s$. The space complexity is $O(1)$.

  • class Solution { public boolean hasSpecialSubstring(String s, int k) { int n = s.length(); for (int l = 0, cnt = 0; l < n;) { int r = l + 1; while (r < n && s.charAt(r) == s.charAt(l)) { ++r; } if (r - l == k) { return true; } l = r; } return false; } } 
  • class Solution { public: bool hasSpecialSubstring(string s, int k) { int n = s.length(); for (int l = 0, cnt = 0; l < n;) { int r = l + 1; while (r < n && s[r] == s[l]) { ++r; } if (r - l == k) { return true; } l = r; } return false; } }; 
  • class Solution: def hasSpecialSubstring(self, s: str, k: int) -> bool: l, n = 0, len(s) while l < n: r = l while r < n and s[r] == s[l]: r += 1 if r - l == k: return True l = r return False 
  • func hasSpecialSubstring(s string, k int) bool { n := len(s) for l := 0; l < n; { r := l + 1 for r < n && s[r] == s[l] { r++ } if r-l == k { return true } l = r } return false } 
  • function hasSpecialSubstring(s: string, k: number): boolean { const n = s.length; for (let l = 0; l < n; ) { let r = l + 1; while (r < n && s[r] === s[l]) { r++; } if (r - l === k) { return true; } l = r; } return false; } 

All Problems

All Solutions