codebuddies / DailyAlgorithms

Do a problem. Create (or find) your problem in the issues. Paste a link to your solution. See others' solutions of the same problem.
12 stars 1 forks source link

[Leetcode] Find all anagrams in a string #45

Open lpatmo opened 5 years ago

lpatmo commented 5 years ago

Given a string s and a non-empty string p, find all the start indices of p's anagrams in s.

Strings consists of lowercase English letters only and the length of both strings s and p will not be larger than 20,100.

The order of output does not matter.

Example 1:

Input: s: "cbaebabacd" p: "abc"

Output: [0, 6]

Explanation: The substring with start index = 0 is "cba", which is an anagram of "abc". The substring with start index = 6 is "bac", which is an anagram of "abc". Example 2:

Input: s: "abab" p: "ab"

Output: [0, 1, 2]

Explanation: The substring with start index = 0 is "ab", which is an anagram of "ab". The substring with start index = 1 is "ba", which is an anagram of "ab". The substring with start index = 2 is "ab", which is an anagram of "ab".

lpatmo commented 5 years ago

var findAnagrams = function(s, p) {
    const output = [];
    for (let i = 0; i < s.length-p.length+1; i++) {
        if (p.indexOf(s[i]) > -1) {
            let initial = i;
            //console.log('initial', i)
            let clone = p.slice();
            console.log(clone)
            //console.∆log('original clone', clone)

            for (let j=i; j<p.length+i; j++) {
                let exists = clone.indexOf(s[j]);
                if (exists > -1 ) {
                    clone = clone.slice(0,exists) + clone.slice(exists+1);
                }
            }
            //console.log('after', clone)
            if (clone.length === 0) {
                output.push(initial);
            }
        }
    }
    return output;
};
//Alternative:
//Create a freq object for target string
//Build up freq object for each substring
//Compare and output.push(initial) if equal
//{a: 1, b: 2, c:1}
lpatmo commented 5 years ago

Third alternative:


var findAnagrams = function(s, p) {
    let pSorted = p.split("").sort().join("");
    const output = [];
    for (let i=0; i < s.length-p.length+1; i++) {
        if (s.substring(i,i+p.length).split("").sort().join("") === pSorted) {
            output.push(i);
        }
    }
    return output;

};