一、题目描述
给定一个字符串,只包含大写字母,求在包含同一字母的子串中,长度第 k 长的子串的长度,相同字母只取最长的那个子串。
二、输入描述
- 第一行有一个子串(1<长度<=100),只包含大写字母;
- 第二行为 k的值;
三、输出描述
输出连续出现次数第k多的字母的次数。
四、解题思路
- 读取输入的字符串和 k 值;
- 将字符串转换为字符数组;
- 使用 HashMap 统计每个字符连续出现的次数;
- 遍历字符数组,记录当前字符和连续出现次数;
- 更新字符的最大连续出现次数;
- 将字符和最大连续出现次数存储在 HashMap 中;
- 将 HashMap 转换为 List,并按照值的降序进行排序;
- 判断 k 是否超过了 List 的长度,如果超过则输出 -1,否则输出第 k 个元素的值;
- 输出最终结果。
五、Java算法源码
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
char[] arr = (scanner.nextLine()).toCharArray();
int k = scanner.nextInt();
Map<Character, Integer> map = new HashMap<Character, Integer>();
char current = arr[0];
char temp;
int count = 0;
for (int i = 0; i < arr.length; i++) {
temp = arr[i];
if (temp == current) {
// 相等,数量加1
count++;
} else {
// 重置统计参数
current = temp;
count = 1;
}
// 记录
if (map.containsKey(current)) {
map.put(current, Math.max(map.get(current), count));
} else {
map.put(current, count);
}
}
// 根据次数排序,从高到底
List<Map.Entry<Character, Integer>> list = new ArrayList<>(map.entrySet());
list.sort((o1, o2) -> o2.getValue().compareTo(o1.getValue()));
// 打印第k多次的子串字母出现次数
if (k > list.size()) {
System.out.println(-1);
} else {
System.out.println(list.get(k - 1).getValue());
}
}
六、效果展示
1、输入
qqwwweeeerrrrrtttttt
3
2、输出
第三长的字符的个数,很明显就是eeee,4。
3、说明
同一字母连续出现的最多的是t,6次;第二多的还是r,5次,第三多的就是e,一共4个e,所以输出4。
🏆下一篇:华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。