Home > Net >  How to create an anagram genrator using JS with recursion
How to create an anagram genrator using JS with recursion

Time:08-15

So I've been trying to create a function that prints out all the possible anagram for a given string , input:abc output:abc,acb,bac,bca,cab,cba But I can't complete it so the probleme is I can't insert the first letter in a specified index in a string any solution?

function anagram(str) {
  if (str.length === 1) return str[0];
  let collection = [];
  let subStr = str.slice(1, str.length);
  let subStrAnagram = anagram(subStr);
  for (let i = 0; i < subStrAnagram.length; i  ) {
    for (let j = 0; j < subStrAnagram[i].length; j  ) {
      let copy = new String(subStrAnagram[i]);
      
    }
  }
  return collection;
}
console.log(anagram("avc"));

CodePudding user response:

How about this:

function anagram(str) {
  // Edge cases
  if (str.length == 0) return [];
  if (str.length == 1) return [str];

  let collection = [];
  anagramRecursive(str, "", collection);
  return collection;
}

function anagramRecursive(str, prev, collection) {
  if (str.length == 0) {
    collection.push(prev);
    return;
  }

  let alreadyUsed = [];

  for (let i = 0; i < str.length; i  ) {
    // If the character at str[i] has already been used at this level,
    // skip it to avoid generating duplicate solutions
    if (alreadyUsed.includes(str[i])) {
      continue;
    }
    alreadyUsed.push(str[i]);

    const current = prev   str[i];
    const newStr = str.slice(0, i)   str.slice(i   1);
    anagramRecursive(newStr, current, collection);
  }
}

Updated to include a check that prevents duplicate solutions from being generated.

CodePudding user response:

The below solution assumes the anagram is a single word with no spaces.

Code explanation are inline.

function anagram(original, str, collections) {  
    let splitted = str.split(''); // convert the string to array. Why? Its easy to handle
    for(let i =0; i < (splitted.length - 1); i  ){ // Run a for loop till last but 1 character.
      const char = splitted[i]; // copy the character at that index
      splitted.splice(i, 1, str[i 1]); // shift the immediate next character to index
      splitted.splice(i 1, 1,char); // insert the copied character to the position of the next
      const joined = splitted.join(''); // join the splitted
      if(collections.indexOf(joined) === -1){ // confirm the string is not previously formed
        collections.push(joined)      // put it inside the collection
      }
    }
    const lastCollection =  collections[collections.length-1]; // take the last collection
    if(lastCollection !== original){ // compare it with the original, if not matches, call anagram function again
     return anagram(original, lastCollection, collections); 
    }
    
    return collections; // else return the collections
}
console.log(anagram("abc", "abc", []));

  • Related