比较两个字符串时如何避免嵌套循环?

时间:2015-10-24 04:20:12

标签: javascript loops nested comparison processing-efficiency

我编写了这段代码,用于检查是否可以从另一个字符串中可用的字母中创建一个单词。例如" 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;循环?

4 个答案:

答案 0 :(得分:2)

声明一个大小为26的数组并将其初始化为0(索引对应于英文字母)。

使用for循环读取更大的字符串并在数组中递增:

a[str1[i]-'a']++

接下来,读取较小的字符串并将其与数组的值进行比较:

if(a[str2[j]-'a']>0){
     a[str2[j]-'a']--;
}

如果str2的所有元素都满足上述条件,则str2可以导出str1

答案 1 :(得分:0)

  • 创建一个大小为26的数组。每个单元格对应一个字母。
  • 循环遍历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.*

}