I've got a little problem searching about backtracking. First of all, in the code I'll link below I found a quite strange syntax to me as a JavaScript programmer:
a[l], a[i] = a[i], a[l]
Using information in this page I figured it out it means: "assign a[i]
to the a[l]
variable and a[l]
to the a[i]
variable". I can't understand the use of this. I thought it would be the same values. If you first assign the value to a[l]
and then try to get a[l]
, it's going to be a[i]
, for both variables.
It's a Python code, however, I'd like to convert it to the JavaScript using the same principle.
# Python program to print all permutations with
# duplicates allowed
def toString(List):
return ''.join(List)
# Function to print permutations of string
# This function takes three parameters:
# 1. String
# 2. Starting index of the string
# 3. Ending index of the string.
def permute(a, l, r):
if l==r:
print toString(a)
else:
for i in xrange(l,r+1):
a[l], a[i] = a[i], a[l]
permute(a, l+1, r)
a[l], a[i] = a[i], a[l] # backtrack
# Driver program to test the above function
string = "aab"
n = len(string)
a = list(string)
permute(a, 0, n-1)
# This code is contributed by Bhavya Jain
You can follow this link to the IDE: https://ide.geeksforgeeks.org/ASvO8MoGQr.
What this code does, is getting the permutation values of the string "aab".
For example, using "aab" as the first string, we should get the following result: aab aba aab aba baa baa.
I tried using "JavaScript" and came up with this:
let arr = [];
let permute = function(str, l, r) {
if (l === r) {
arr.push(str);
} else {
for (let i = l; i <= r; i++) {
str[l] = str[i];
str[i] = str[l];
permute(str, l + 1, r);
str[l] = str[i];
str[i] = str[l];
}
}
};
permute('aab', 0, 'aab'.length - 1);
console.log(arr);
The result I get is ["aab", "aab", "aab", "aab", "aab", "aab"]
.
Link to the JSFiddle: https://jsfiddle.net/xrfkt9qj/1/.
EDIT1 I've tried the @jp_data_analysis answer, but it still returns bad results: https://jsfiddle.net/zurvm0xy/.
EDIT2 ES6 Version of the script: https://jsfiddle.net/zurvm0xy/4/.
It's not a duplicate, the variable swapping is only a first part of this problem. Please read the full article.