import java.util.*;
/**
* 快慢指针,left指针指向左边当前字符的index,right指针指向右边当前字符的index,
* right逐渐右移,并且统计left到right之间当前字符的个数,
* 当left到right中有k个当前字符时,子串长度l1 = right - left + 1;
* 当right继续右移,为了保持left到right中只有k个当前字符,left也右移,
* 此时子串长度l2 = right - left + 1,比较l1与l2,取其中小,循环此过程
* 当'a'到'z'都以这种方式取完后,所得最小长度,即为最小子串长度。
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param str string字符串
* @param k int整型
* @return int整型
*/
public int eliStr (String str, int k) {
// write code here
int num = 0;
int min = Integer.MAX_VALUE;
for(char i = 'a'; i <= 'z'; i++) {
int l = getLength(str, String.valueOf(i), k);
if(l == k) {
return l;
}
if(l != -1) {
min = Math.min(l, min);
}
}
if(min == Integer.MAX_VALUE) {
min = -1;
}
return min;
}
public int getLength(String str, String i, int k) {
int num = 0;
int left = str.indexOf(i);
int right = left;
int len = Integer.MAX_VALUE;
while(right != -1) {
num ++;
if(num > k) {
left = str.indexOf(i, left + 1);
len = Math.min(right - left + 1, len);
} else if(num == k) {
len = Math.min(right - left + 1, len);
}
right = str.indexOf(i, right + 1);
}
if(len == Integer.MAX_VALUE) {
len = -1;
}
return len;
}
}