LeetCode Top Interview Questions 395. Longest Substring with At Least K Repeating Characters (Java版; Meidum)
题目描述
Find the length of the longest substring T of a given string (consists of lowercase letters only)
such that every character in T appears no less than k times.
Example 1:
Input:
s = "aaabb", k = 3
Output:
3
The longest substring is "aaa", as 'a' is repeated 3 times.
Example 2:
Input:
s = "ababbc", k = 2
Output:
5
The longest substring is "ababb", as 'a' is repeated 2 times and 'b' is repeated 3 times.
第一次做; 直接借鉴了题解的思想, 使用递归处理
class Solution {
public int longestSubstring ( String s, int k) {
char [ ] chs = s. toCharArray ( ) ;
return core ( chs, k, 0 , s. length ( ) - 1 ) ;
}
public int core ( char [ ] chs, int k, int left, int right) {
if ( right- left+ 1 < k)
return 0 ;
int [ ] arr = new int [ 26 ] ;
for ( int i= left; i<= right; i++ ) {
arr[ chs[ i] - 'a' ] ++ ;
}
for ( int i= left; i<= right && right- left>= k; i++ ) {
if ( arr[ chs[ i] - 'a' ] < k)
left= i+ 1 ;
else
break ;
}
for ( int j= right; j>= left && right- left>= k; j-- ) {
if ( arr[ chs[ j] - 'a' ] < k)
right= j- 1 ;
else
break ;
}
int max = 0 ;
for ( int i= left; i<= right; i++ ) {
if ( arr[ chs[ i] - 'a' ] < k) {
max = Math. max ( core ( chs, k, left, i- 1 ) , core ( chs, k, i+ 1 , right) ) ;
return max;
}
}
return right- left+ 1 ;
}
}
未完成的双指针想法
class Solution {
public int longestSubstring ( String s, int k) {
int n = s. length ( ) ;
int flag = 0 ;
HashMap< Character, Integer> map = new HashMap < > ( ) ;
int left= 0 , right= 0 ;
while ( right< n) {
}
}
}
class Solution {
public int longestSubstring ( String s, int k) {
int len = s. length ( ) ;
if ( len == 0 || k > len) return 0 ;
if ( k < 2 ) return len;
return count ( s. toCharArray ( ) , k, 0 , len - 1 ) ;
}
private static int count ( char [ ] chars, int k, int p1, int p2) {
if ( p2 - p1 + 1 < k) return 0 ;
int [ ] times = new int [ 26 ] ;
for ( int i = p1; i <= p2; ++ i) {
++ times[ chars[ i] - 'a' ] ;
}
while ( p2 - p1 + 1 >= k && times[ chars[ p1] - 'a' ] < k) {
++ p1;
}
while ( p2 - p1 + 1 >= k && times[ chars[ p2] - 'a' ] < k) {
-- p2;
}
if ( p2 - p1 + 1 < k) return 0 ;
for ( int i = p1; i <= p2; ++ i) {
if ( times[ chars[ i] - 'a' ] < k) {
return Math. max ( count ( chars, k, p1, i - 1 ) , count ( chars, k, i + 1 , p2) ) ;
}
}
return p2 - p1 + 1 ;
}
}