JavaScript是否有方法解决统计字符串中可组成DOGGY的次数问题?
用JavaScript统计字符串中可组成单词DOGGY的最大次数
问题需求:
给定一个仅包含大写字母的字符串,统计其中能组成单词DOGGY的最大次数。
示例:
- 字符串
'DHTHTOMMGGSDY'可组成DOGGY1次; - 字符串
'DXOXGGYDXOXGGY'可组成DOGGY2次; - 字符串
'DXOXGXY'可组成DOGGY0次;
我的尝试:
我用扩展运算符[...string]把字符串转成数组,再用filter()筛选字符,但没法正确处理DOGGY里重复的两个G。
当前代码:
let result = [...string].filter((char) => { let word = char !== 'D' && char !== 'O' && char !== 'G' && char !== 'G' && char !== 'Y'; console.log(word); }); console.log(result);
高效解法思路
核心是统计目标字符的出现频次:DOGGY需要1个D、1个O、2个G、1个Y。能组成的次数由这几个字符的可用数量决定:
- 统计字符串中D、O、G、Y各自的出现次数;
- 计算G的可用组数(即
Math.floor(G的数量 / 2)); - 最终次数取D、O、G的组数、Y这四个值中的最小值。
代码实现
function countDoggy(str) { // 初始化目标字符计数 const counts = { D: 0, O: 0, G: 0, Y: 0 }; // 遍历字符串统计频次 for (const char of str) { if (counts.hasOwnProperty(char)) { counts[char]++; } } // 计算可组成的DOGGY次数:G需要两个才能算一组 return Math.min(counts.D, counts.O, Math.floor(counts.G / 2), counts.Y); } // 测试示例 console.log(countDoggy('DHTHTOMMGGSDY')); // 输出1 console.log(countDoggy('DXOXGGYDXOXGGY')); // 输出2 console.log(countDoggy('DXOXGXY')); // 输出0
对你当前代码的问题说明
你的filter()写法逻辑错误:当前代码是筛选不属于DOGGY的字符,而且重复写char !== 'G'没有意义,根本没法统计每个字符的可用数量,自然处理不了重复G的问题。上面的解法通过统计频次的方式,能高效解决重复字符的需求,时间复杂度是O(n)(n为字符串长度),是最优的解法之一。
内容的提问来源于stack exchange,提问作者Ignacio García
相关产品推荐
相关产品推荐

