我编写了这段代码,用于检查是否可以从另一个字符串中可用的字母中创建一个单词。例如" wine"可以使用str1 =" kkwlaiern"中包含的字母书写。但是,我正在寻找一种更有效的方法。到目前为止,这是我的代码:
function scramble(str1, str2) {
x =str1.split("");
y =str2.split("");
var h = 0;
for (i=0, g = y.length; i<g; i++){
for (j=0, f= x.length; j<f; j++){
if (x[j]==y[i]){
x.splice(j,1);
h++;
break;
}}
}
if( h == y.length){
return true;}
else{return false;}
}
如何在没有嵌套的情况下编写相同的功能&#34;对于&#34;循环?
答案 0 :(得分:2)
声明一个大小为26的数组并将其初始化为0(索引对应于英文字母)。
使用for
循环读取更大的字符串并在数组中递增:
a[str1[i]-'a']++
接下来,读取较小的字符串并将其与数组的值进行比较:
if(a[str2[j]-'a']>0){
a[str2[j]-'a']--;
}
如果str2
的所有元素都满足上述条件,则str2
可以导出str1
。
答案 1 :(得分:0)
str1
并在数组中为字符串中的每个字母添加1。str2
。如果您在数组中找到一个字母为0的字母 - 返回false。如果你循环整个字符串 - 返回true 答案 2 :(得分:0)
使用正则表达式
更好var str1 = 'eve'
var str2 = 'Whatever'
if(st2.match(str1.split('+') && str1.length === str2.length ){
//handle true
}
答案 3 :(得分:0)
问我一点,但这是我的解决方案,将数组元素转换为新Object中的属性值。提高效率,因为不需要循环遍历两个数组的每个元素。
function scramble(str1, str2) {
x= str1.split(""); y= str2.split("");
var arr = new Object();
for(i=0; x.length > i; i++){
arr[x[i]] = (arr[x[i]] || 0) +1;} *//counts occurrence of elements in x and stores them as values inside Object*
for(i =0; y.length > i; i++){
arr[y[i]] = (arr[y[i]] || 0)-1;*// reduce value (-1) if y[i] is found in Object*
if (arr[y[i]] < 0){ return false;}} *// returns false if y[i] wasn't found*
return true; *//otherwise returns true.*
}