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", []));