2015-07-28 14 views
2

我想比較兩個字符串,看看是否所有的字符串的輸入也是在另一個字符串,不管順序。我怎樣才能找到是否所有的string2字母也包含在string1的某處?

到目前爲止,我有以下代碼...

我在做什麼錯了?

var str1= "rkqodlw" 
var str2= "world" 

StringScrambler(str1, str2); 

function StringScrambler(str1, str2) { 
    var string1= str1.split("").sort(); 
     console.log(string1); 
    var string2 = str2.split("").sort(); 
     console.log(string2); 
    matches = []; 
    for (i=0; i< string1.length; i++) { 
     for (j=0; j<string2.length; i++) { 
      while (j === i) { 
       matches.push(j); 
       console.log(matches); 
       var matchSort = matches.sort(); 
       console.log(matchSort); 
       if (matchSort === string2) { 
        return true; 
       }else { 
        return false; 
       } 
      } 
     } 
    } 
} 
+0

你不能比較數組與'===',爲什麼使用'while'循環?我想你忘了檢查重複的信件。 – Hacketo

回答

1

一切答案這一步工作正常,但他們會爲雙字母單詞的第二個字符串在第一個沒有工作,但不(對於如「worlld」。 - 注意雙L)。訣竅是影響第一個單詞,使其刪除找到的字符,以便不再檢查相同的字母。像這樣的事情會做的伎倆:

// Check if the second string's characters are 
// found in the first string 
function StringScrambler(str1, str2) { 
    var arr1 = str1.split(''), 
     arr2 = str2.split(''), 
     isATrueSubset = true, 
     indexOfChar; 

    arr2.forEach(function(char) { 
    indexOfChar = arr1.indexOf(char); 
    if (indexOfChar > -1) { 
     // Remove the character that was found 
     // to avoid matching against it again 
     arr1.splice(indexOfChar, 1); 
    } else { 
     isATrueSubset = false; 
     // No need to continue 
     return; 
    } 
    }); 

    console.log(isATrueSubset); 
    return isATrueSubset; 
} 

StringScrambler('rkqodlw ', 'world '); // outputs true 
StringScrambler('rkqodlw ', 'worlld '); // outputs false 
+0

會有答案,但你在這裏頭痛 - 我最喜歡的做法可能是對兩個字符串進行排序,而不是分割成一個實際的數組,然後把它們當作數組遍歷,只要你擊中搜索字符串的結尾然後它被發現,但如果你擊中源字符串的結尾,那麼它不是... – Rycochet

+0

感謝您的評論Rycochet!我之所以沒有去參加某種活動,是因爲我認爲這並不重要,因爲這些信件的順序並不是提問者關心的問題。我也喜歡在字符串級別拼接它,但是JS沒有像String一樣的內置字符串拼接。無論如何,這是一個有趣的小問題,我相信你也快來解決它:) – walmik

+0

請注意,並非所有的瀏覽器都支持沒有polyfill的foreach – mplungjan

0

如果str2的始終是str1中的一個子集,那麼這個答案可以用

Compute intersection of two arrays in JavaScript

var arr1 = "rkqodlw".split(""); 
 
var arr2 = "world".split(""); 
 

 
var commonValues = arr2.filter(function(value) { 
 
    return arr1.indexOf(value) > -1; 
 
}); 
 

 
alert(commonValues.join(""))

1

var one = "dlrow"; 
 
var two = "world"; 
 
var allCharsFound = true; 
 
one.split("").map(function(char) { 
 
    if (two.indexOf(char) < 0) { 
 
     allCharsFound = false; 
 
    } 
 
}); 
 
console.log(allCharsFound);

0

您可以使用下面的代碼來執行此任務:

alert (AllFirstInSecond("world", "rkqodlw")); 
alert (AllFirstInSecond("worldz", "rkqodlw")); 

function AllFirstInSecond(str1, str2) { 
    var pos = str1.length - 1; 
    while (pos >= 0) { 
     if (str2.indexOf(str1.substr(pos--,1)) == -1) { 
      return false; 
     } 
    } 
    return true; 
} 

它只是檢查第一個字符串中的每一個字符,看它是否是在第二位。如果不是,則返回false。

只有一次都找到了它纔會返回true。

有優化的可能性(即使是已經檢查過的副本,每個字符都會被檢查),但除非您的字符串特別大,否則可能沒有太多的絕對收益。

1
var str1= "rkqodlw"; 
var str2= "world"; 

function test($str1, $str2) { 
    var string2 = str2.split(""); 
    for(var i=0; i<string2.length; i++) { 
    if (str1.indexOf(string2[i]) == -1) { 
     return false; 
    } 
    } 
    return true; 
} 
0

這將比較第一個字符串中第二個字符串的每個單詞,如果它存在,它將被添加到mathes數組中。

var str1= "rkqodlw"; 
var str2= "world2"; 

StringScrambler(str1, str2); 

function StringScrambler(str1, str2) { 

var string2 = str2.split("").sort(); 

console.log(string2); 
matches = []; 
for (j=0; j<string2.length; j++) { 
    if(str1.indexOf(string2[j]) > -1){ 
     matches.push(string2[j]); 
     console.log(string2[j]);  
    } 
} 
console.log(matches); 

} 
0

試試這個:

var str1= "rkqodlw" 
var str2= "world" 

StringScrambler(str1, str2); 

    function StringScrambler(str1, str2) { 
    var string1 = str1.split("").sort(); 

    var string2 = str2.split("").sort(); 

    matches = []; 
    for (i = 0; i < string1.length; i++) { 
     if (string2.indexOf(string1[i]) > -1) matches.push(string1[i]); 
    } 
return matches 
} 
相關問題