题目描述
给定一个字符串Q,只包含大写字母,求在包含同一字母
的子串中,长度第k长的子串的长度,相同字母只取最长的那个子串
输入描述
第一行有一个子串(1<长度<=100),只包含大写字母。
第二行为 k
的值
输出描述
输出连续出现次数第 k
多的字母的次数。
示例1
输入
AAAAHHHBBCDHHHH
3
输出
2
说明
同一字母连续出现的最多的是A和H,四次;
第二多的是H,3次,但是H已经存在4个连续的,故不考虑:
下个最长子串是BB,所以最终答案应该输出2.
示例2
输入
AABAAA
2
输出
1
说明
同一字母连续出现的最多的是A,三次;第二多的还是A,两次,但A已经存在最大连续次数三次故不考虑:
下个最长子串是B,所以输出1。
示例3
输入
ABC
4
输出
-1
说明
只含有3个包含同一字母的子串,小于k,输出-1
示例4
输入
ABC
2
输出
1
说明
三个子串长度均为1,所以此时k=1,k=2,k=3这三种情况均输出1。特此说明,避免歧义。
注:本文章只是提供一种方法,作为一个记录,相较一些大佬的代码而言,此代码比较冗余。
java
package odTest;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeSet;
public class charLen {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
char[] charLen=scanner.nextLine().toCharArray();
Map<Character,Integer> map = new HashMap<>();
// map.getOrDefault(key, defaultValue)
int count = 0;
for(int i=0;i<charLen.length;i++) {
if(map.containsKey(charLen[i])) {
count++;
}else {
map.put(charLen[i], 0);
count++;
}
if(i!=charLen.length-1 && charLen[i]!=charLen[i+1]) {
if(map.get(charLen[i]).equals(0)) {
map.replace(charLen[i], count);
}else if(count>map.get(charLen[i])) {
map.replace(charLen[i], count);
}
count = 0;
}else if(i == charLen.length-1) {
if(map.get(charLen[i]).equals(0)) {
map.replace(charLen[i], count);
}else if(count>map.get(charLen[i])) {
map.replace(charLen[i], count);
}
}
}
int num = Integer.parseInt(scanner.nextLine());
TreeSet<String> tree = new TreeSet<>();
for(Map.Entry<Character, Integer> entry: map.entrySet()) {
tree.add(entry.getValue()+""+entry.getKey());
}
if(tree.size()<num) {
System.out.println(-1);
System.exit(0);
}
//迭代器输出
Iterator<String> out = tree.descendingIterator();
int i = 0;
while (out.hasNext()) {
i++;
if(i==num) {
System.out.print(out.next().charAt(0)+" ");
break;
}
out.next();
}
}
}