一、题目描述
给定一个字符串,只包含大写字母,求在包含同一字母的子串中,长度第 k 长的子串的长度,相同字母只取最长的那个子串。
二、输入描述
- 第一行有一个子串(1<长度<=100),只包含大写字母;
- 第二行为 k的值;
三、输出描述
输出连续出现次数第k多的字母的次数。
四、解题思路
- 读取输入的字符串和 k 值;
- 使用 HashMap 统计每个字符连续出现的次数;
- 遍历字符数组,记录当前字符和连续出现次数;
- 更新字符的最大连续出现次数;
- 将字符和最大连续出现次数存储在 HashMap 中;
- 将 HashMap 转换为 List,并按照值的降序进行排序;
- 判断 k 是否超过了 List 的长度,如果超过则输出 -1,否则输出第 k 个元素的值;
- 输出最终结果。
五、JavaScript算法源码
function findK(s, k) {
// 使用 HashMap 统计每个字符连续出现的次数
const map = new Map();
let current = s[0];
let count = 0;
// 遍历字符数组,记录当前字符和连续出现次数
for (let i = 0; i < s.length; i++) {
const temp = s[i];
if (temp === current) {
// 更新字符的最大连续出现次数
count++;
} else {
// 重置统计参数
current = temp;
count = 1;
}
// 将字符和最大连续出现次数存储在 HashMap 中
if (map.has(current)) {
map.set(current, Math.max(map.get(current), count));
} else {
map.set(current, count);
}
}
// 将 HashMap 转换为 List,并按照值的降序进行排序
const sortedEntries = [...map.entries()].sort((a, b) => b[1] - a[1]);
// 判断 k 是否超过了 List 的长度
if (k > sortedEntries.length) {
return -1;
} else {
return sortedEntries[k - 1][1];
}
}
六、效果展示
1、输入
qqwwweeeerrrrrtttttt
3
2、输出
第三长的字符的个数,很明显就是eeee,4。
3、说明
同一字母连续出现的最多的是t,6次;第二多的还是r,5次,第三多的就是e,一共4个e,所以输出4。
🏆下一篇:华为OD机试真题 JavaScript 实现【相对开音节】【2022Q4 100分】,附详细解题思路
🏆本文收录于,华为OD机试(JavaScript)真题(A卷+B卷)
每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。