Javascript 检查数组A中的数组B置换
目标 给定数组A和数组B,查看数组B的值是否在数组A内(忽略序列/顺序)。本质上,我们正在检查一个数组中包含的所有字母是否以某种形式包含在另一个数组中 示例#1Javascript 检查数组A中的数组B置换,javascript,arrays,recursion,Javascript,Arrays,Recursion,目标 给定数组A和数组B,查看数组B的值是否在数组A内(忽略序列/顺序)。本质上,我们正在检查一个数组中包含的所有字母是否以某种形式包含在另一个数组中 示例#1 mutation(['hello', 'hey']); false //no 'y' in 'hello' 输出#1 mutation(['hello', 'hey']); false //no 'y' in 'hello' 示例#2 mutation(['Alien', 'line'])) true //'l','i','
mutation(['hello', 'hey']);
false //no 'y' in 'hello'
输出#1
mutation(['hello', 'hey']);
false //no 'y' in 'hello'
示例#2
mutation(['Alien', 'line']))
true //'l','i','n','e' is present in 'Alien'
输出#2
mutation(['Alien', 'line']))
true //'l','i','n','e' is present in 'Alien'
我的伪代码/尝试
function mutation(arr) {
//split into two arrays with individual letters (for comparison purposes)
var arr0 = arr[0].split('');
var arr1 = arr[1].split('');
//if the letters in arr[1] exceed arr[0], there is no match (no matter what)
if (arr1 > arr0) {
return false;
}
//if arr0 > arr1 check each letter or arr1[i] against arr0[j].
else if (arr0 > arr1) {
for (i = 0; i < arr1.length; i++) {
//compare arr1[i] to all arr0[j] values
//if all of arr1 is present in arr0, return true
return true;
}
} else {
//If one of arr1's letters is not present in arr0, return false
return false;
}
}
mutation(['hello', 'hey']);
功能突变(arr){
//拆分为两个带有单个字母的数组(用于比较)
var arr0=arr[0]。拆分(“”);
var arr1=arr[1]。拆分(“”);
//如果arr[1]中的字母超过arr[0],则不存在匹配项(无论发生什么情况)
如果(arr1>arr0){
返回false;
}
//如果arr0>arr1,则检查每个字母或arr1[i]与arr0[j]。
如果(arr0>arr1){
对于(i=0;i
问题
例如,在
“bad”
中查找“aaa”
时,伪代码会给出误报。当第一个字符串中的字符与第二个字符串中的字符相匹配时,您需要从第一个字符串中删除这些字符,以便它们不会在第二个字符串中重复使用
循环第二个字符串中的字符,并在第一个字符串中查找它们。如果找到它,请从第一个字符串中删除它,否则返回false。如果找到所有字符,则返回true:
function mutation(str1, str2){
for (var i = 0; i < str2.length; i++) {
var index = str1.indexOf(str2.charAt(i));
if (index == -1) return false;
str1 = str1.substr(0, index) + str1.substr(index + 1);
}
return true;
}
功能突变(str1、str2){
对于(变量i=0;i
解决此问题的“暴力”方法是使用2个嵌套for循环迭代数组。但是,这将导致O(n^2)运行时复杂性
为了解决O(n)运行时的复杂性,将所有数组A的值存储在哈希中,然后检查数组B的值是否在哈希中。请注意,此解决方案仍然有2个for循环,不同之处在于它们不是嵌套的,这会导致O(n)运行时复杂性
var突变=函数(arr){
var areBInA=true;
//从字符串转换为数组
var a=arr[0]。拆分(“”);
var b=arr[1]。拆分(“”);
console.log('ab%o%o',a,b);
//为数组A创建哈希
var aHash={};
对于(变量i=0;i
您的意思是您正好有两个字符串,要检查其中一个是否包含另一个的所有字母?有两个以上的参数吗?@SpiderPig-参数不能超过两个。@DavidThomas它们确实是以字符串开头的,但我认为将它们分解成单独的数组可以让我循环每个数组的每个字母,以便于“检查”。也许这不是正确的方法?你能解释一下“str1=str1.substr(0,索引)+str1.substr(索引+1)”及其用途吗?据我所知,您的代码是这样写的:@kidlogic:这将删除索引
位置处的字符。它取该字符前面的字符串部分加上该字符后面的字符串部分。感谢您提供了这个优雅的解决方案和解释!