Zoeken…


Invoering

Twee snaren met dezelfde set tekens worden anagram genoemd. Ik heb hier Javascript gebruikt.

We zullen een hash van str1 maken en het aantal +1 verhogen. We zullen een lus maken op de 2e string en controleren of alle tekens zich in hash bevinden en de waarde van de hash-toets verlagen. Controleer of alle waarde van de hashsleutel nul is, is een anagram.

Voorbeeld invoer en uitvoer

EX1: -

let str1 = 'stackoverflow';
let str2 = 'flowerovstack';

Deze tekenreeksen zijn anagrammen.

// Maak Hash van str1 en verhoog een telling.

hashMap = {
    s : 1,
    t : 1,
    a : 1,
    c : 1,
    k : 1,
    o : 2,
    v : 1,
    e : 1,
    r : 1,
    f : 1,
    l : 1,
    w : 1
}

Je kunt zien dat hashKey 'o' waarde 2 bevat omdat o 2 keer in string voorkomt.

Loop nu over str2 en controleer of elk teken aanwezig is in hashMap, zo ja, verlaag de waarde van hashMap Key, anders retourneer false (wat aangeeft dat het geen anagram is).

hashMap = {
    s : 0,
    t : 0,
    a : 0,
    c : 0,
    k : 0,
    o : 0,
    v : 0,
    e : 0,
    r : 0,
    f : 0,
    l : 0,
    w : 0
}

Loop nu over het hashMap-object en controleer of alle waarden nul zijn in de sleutel van hashMap.

In ons geval zijn alle waarden nul, dus het is een anagram.

Generieke code voor anagrammen

(function(){

    var hashMap = {};
    
    function isAnagram (str1, str2) {
    
        if(str1.length !== str2.length){
            return false;
        }
        
        // Create hash map of str1 character and increase value one (+1).
        createStr1HashMap(str1);

        // Check str2 character are key in hash map and decrease value by one(-1);
        var valueExist = createStr2HashMap(str2);

        // Check all value of hashMap keys are zero, so it will be anagram.
        return isStringsAnagram(valueExist);
    }
    
    function createStr1HashMap (str1) {
        [].map.call(str1, function(value, index, array){
            hashMap[value] = value in hashMap ?  (hashMap[value] + 1) : 1;
            return value;
        });
    }
    
    function createStr2HashMap (str2) {
        var valueExist = [].every.call(str2, function(value, index, array){
            if(value in hashMap) {
                hashMap[value] = hashMap[value] - 1;
            }
            return value in hashMap;
        });
        return valueExist;
    }
    
    function isStringsAnagram (valueExist) {
        if(!valueExist) {
            return valueExist;
        } else {
            var isAnagram;
            for(var i in hashMap) {
                if(hashMap[i] !== 0) {
                    isAnagram = false;
                    break;
                } else {
                    isAnagram = true;
                }
            }
    
            return isAnagram;
        }
    }
    
    isAnagram('stackoverflow', 'flowerovstack'); // true
    isAnagram('stackoverflow', 'flowervvstack'); // false
    
})();

Tijdcomplexiteit: - 3n ie O (n).



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow