如何实现判断数组首字符串是否包含次字符串全部字符的功能
解决数组中第一个字符串是否包含第二个字符串所有字符的问题
我来帮你搞定这个字符串包含判断的需求!先理清楚规则,再看看现有代码的问题,最后给你完整的实现方案。
需求明确
咱们要写一个叫mutation(arr)的函数,规则是:
- 传入的数组里,
arr[0]是目标字符串,arr[1]是需要检查的字符集合 - 检查不区分大小写,比如"Web"和"web"视为完全相同的字符
- 只要
arr[1]里有一个字符不在arr[0]中,就返回false;所有字符都存在则返回true - 示例验证:
- 传入
["Floor", "far"]返回false,因为"a"不在"Floor"中 - 传入
["Newbie", "web"]返回true,因为"web"的所有字符都能在"Newbie"里找到
- 传入
现有代码的问题分析
你给出的代码片段:
function mutation(arr) { var newArr = []; for (i=0; i<arr.length; i++) { newArr.push(arr[i].toLowerCase().split("")); } for (i=0; i<newArr.length; i++) { fo... }
这里有几个需要修正的点:
- 变量
i没有用let/const声明,会变成全局变量,容易引发意外的bug - 第二个循环的逻辑没写完,而且其实不需要遍历整个
newArr,只需要遍历第二个字符串的字符(也就是newArr[1])逐个检查即可 - 可以用更简洁高效的方法替代拆分数组的思路
完整实现方案
这里给你两种实用的写法,按需选择:
写法1:基础遍历实现(贴近你的初始思路)
function mutation(arr) { // 统一转成小写,消除大小写差异的影响 const targetStr = arr[0].toLowerCase(); const checkStr = arr[1].toLowerCase(); // 逐个检查需要验证的字符 for (let char of checkStr) { // 发现不存在的字符直接返回false,不用继续遍历 if (!targetStr.includes(char)) { return false; } } // 所有字符都存在,返回true return true; }
测试一下你的示例:
mutation(["Floor", "far"])→ "far"转成"far","floor"里没有"a",返回false,符合要求mutation(["Newbie", "web"])→ "web"转成"web","newbie"包含所有字符,返回true,符合要求
写法2:用Set优化查找(适合长字符串场景)
如果处理的字符串很长,用Set可以把字符查找的时间复杂度从O(n)降到O(1),性能更优:
function mutation(arr) { // 把目标字符串转成小写后生成字符集合 const targetChars = new Set(arr[0].toLowerCase()); const checkStr = arr[1].toLowerCase(); // 遍历检查每个字符是否在集合中 for (let char of checkStr) { if (!targetChars.has(char)) { return false; } } return true; }
这个版本的逻辑和第一个完全一致,但查找效率更高,适合处理大字符串的场景。
额外提示
一定要记得统一转换大小写!如果漏掉这一步,会出现"Floor"和"Far"因为大小写差异判断错误的情况。
内容的提问来源于stack exchange,提问作者muszynov
相关产品推荐
相关产品推荐

