基于字符匹配sharedStart函数,如何实现按单词匹配的sharedStartByWord?
没问题,我来帮你搞定这个按单词匹配共同前缀的需求!原来的sharedStart是逐字符比对,现在我们要改成按单词粒度来匹配共同前缀,思路其实很清晰,不用搞复杂的方案,我给你一步步拆解:
核心思路
- 先把每个输入字符串拆分成单词数组(处理任意空格分隔的情况)
- 找到最短的单词数组,因为共同前缀的长度不可能超过它
- 逐个位置比对所有字符串的对应单词,直到出现不匹配的单词就停止
- 把匹配到的单词重新拼接成字符串,就是最终的共同前缀
具体代码实现(JavaScript)
function sharedStartByWord(strings) { // 处理边界情况:空数组或者只有一个字符串 if (!strings || strings.length === 0) return ''; if (strings.length === 1) return strings[0].trim(); // 将每个字符串拆分成单词数组(分割任意数量的空白字符) const wordArrays = strings.map(str => str.trim().split(/\s+/)); // 找到最短的单词数组,限制比对的最大长度 const minLength = Math.min(...wordArrays.map(arr => arr.length)); let commonWords = []; // 逐个位置比对单词 for (let i = 0; i < minLength; i++) { // 取第一个字符串的当前位置单词作为基准 const currentWord = wordArrays[0][i]; // 检查所有其他字符串的当前位置单词是否和基准一致 const allMatch = wordArrays.every(arr => arr[i] === currentWord); if (allMatch) { commonWords.push(currentWord); } else { // 出现不匹配,直接跳出循环 break; } } // 把匹配到的单词拼接成字符串 return commonWords.join(' '); }
示例测试
比如你提到的场景,输入:
const testStrings = [ "Noitidart Sab Hello", "Noitidart Sab World", "Noitidart Sab FooBar" ]; console.log(sharedStartByWord(testStrings)); // 输出:"Noitidart Sab"
额外说明
- 这个函数会自动处理开头/结尾的空格,以及多个连续空格的情况(比如字符串里有多个空格分隔单词)
- 如果没有任何共同单词前缀,会返回空字符串
- 如果输入只有一个字符串,会返回该字符串去除首尾空格后的内容
这样实现是不是简洁多了?完全不用复杂的逻辑,核心就是把字符比对换成单词比对就好啦~
内容的提问来源于stack exchange,提问作者Noitidart
相关产品推荐
相关产品推荐

