如何校验用户拼写单词的字母使用次数不超过指定9字母数组的出现次数
9字母网格单词拼写校验逻辑实现方案
核心校验逻辑分为3步
1. 预计算给定字母的频率统计
- 先把字母数组所有元素统一转为小写(或大写,保证全局统一即可),用哈希表/Map统计每个字母的出现次数,示例中给定数组的统计结果为:
a:1、p:1、l:2、e:1、c:1、n:1、t:1、w:1 - 该统计只需在字母数组生成时计算一次,不需要每次校验都重复计算
2. 预处理用户输入的单词
- 把用户输入的单词统一转为和前面相同的大小写,同时过滤掉空格、标点等非字母字符,比如输入
Apple!会被处理为apple
3. 规则匹配校验
- 首先判断处理后的单词长度是否超过9,超过直接判定为不符合(总共只有9个字母,每个最多用一次,最长单词只能是9个字母)
- 统计用户单词中每个字母的出现次数,和预存的字母频率做对比:如果任意一个字母的使用次数超过给定数组中的该字母数量,直接判定为不符合;所有字母的次数都满足要求则符合规则
示例中的单词
apple统计出p的出现次数为2,大于给定数组中p的数量1,因此判定不符合
可扩展补充:合法单词校验
如果要求拼写的必须是真实存在的英文单词,可以提前加载本地英文词典数据集(比如存为Set结构),完成上述规则校验后,再判断单词是否存在于词典集合中即可。
参考实现代码(JavaScript)
// 生成给定字母的频率统计,仅需初始化执行一次 const calcLetterCount = (letterArr) => { return letterArr.reduce((countMap, item) => { const lowerItem = item.toLowerCase(); countMap[lowerItem] = (countMap[lowerItem] || 0) + 1; return countMap; }, {}); }; // 初始化:给定的9字母数组 const gridLetters = ["A", "P", "L", "E", "C", "N", "T", "L", "W"]; const gridLetterCount = calcLetterCount(gridLetters); // 可选:预加载的合法英文单词集合,仅需初始化执行一次 // const validWordSet = new Set(/* 加载本地词典数组 */); // 校验函数,每次用户提交单词时调用 const checkWordValid = (inputWord) => { // 清洗用户输入 const cleanWord = inputWord.toLowerCase().replace(/[^a-z]/g, ''); // 长度校验 if (cleanWord.length > gridLetters.length) return false; // 统计输入单词的字母频率 const wordLetterCount = calcLetterCount(cleanWord.split('')); // 频率匹配校验 for (const [letter, count] of Object.entries(wordLetterCount)) { if (!gridLetterCount[letter] || count > gridLetterCount[letter]) { return false; } } // 可选:合法单词校验 // if (!validWordSet.has(cleanWord)) return false; return true; }; // 测试示例 console.log(checkWordValid("apple")); // 输出 false console.log(checkWordValid("plate")); // 输出 true
内容的提问来源于stack exchange,提问作者Nasian
相关产品推荐
相关产品推荐

