class Solution {
public int getMinSwaps(String num, int k) {
int[] A = new int[num.length()]; // Original
for (int i = 0; i < A.length; ++i)
A[i] = num.charAt(i) - '0';
int[] B = A.clone(); // Permutated
for (int i = 0; i < k; ++i)
nextPermutation(B);
return countSteps(A, B);
}
public void nextPermutation(int[] nums) {
final int n = nums.length;
// From the back to the front, find the first num < nums[i + 1].
int i;
for (i = n - 2; i >= 0; --i)
if (nums[i] < nums[i + 1])
break;
// From the back to the front, find the first num > nums[i] and swap it with nums[i].
if (i >= 0)
for (int j = n - 1; j > i; --j)
if (nums[j] > nums[i]) {
swap(nums, i, j);
break;
}
// Reverse nums[i + 1..n - 1]
reverse(nums, i + 1, n - 1);
}
private void reverse(int[] nums, int l, int r) {
while (l < r)
swap(nums, l++, r--);
}
private void swap(int[] nums, int i, int j) {
final int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
private int countSteps(int[] A, int[] B) {
int count = 0;
for (int i = 0, j = 0; i < A.length; ++i) {
j = i;
while (A[i] != B[j])
++j;
while (i < j) {
swap(B, j, j - 1);
--j;
++count;
}
}
return count;
}
}