|
| 1 | +# Time: O((k + n) * n) |
| 2 | +# Space: O(n) |
| 3 | + |
| 4 | +class Solution(object): |
| 5 | + def getMinSwaps(self, num, k): |
| 6 | + """ |
| 7 | + :type num: str |
| 8 | + :type k: int |
| 9 | + :rtype: int |
| 10 | + """ |
| 11 | + def next_permutation(nums, begin, end): |
| 12 | + def reverse(nums, begin, end): |
| 13 | + left, right = begin, end-1 |
| 14 | + while left < right: |
| 15 | + nums[left], nums[right] = nums[right], nums[left] |
| 16 | + left += 1 |
| 17 | + right -= 1 |
| 18 | + |
| 19 | + k, l = begin-1, begin |
| 20 | + for i in reversed(xrange(begin, end-1)): |
| 21 | + if nums[i] < nums[i+1]: |
| 22 | + k = i |
| 23 | + break |
| 24 | + else: |
| 25 | + reverse(nums, begin, end) |
| 26 | + return False |
| 27 | + for i in reversed(xrange(k+1, end)): |
| 28 | + if nums[i] > nums[k]: |
| 29 | + l = i |
| 30 | + break |
| 31 | + nums[k], nums[l] = nums[l], nums[k] |
| 32 | + reverse(nums, k+1, end) |
| 33 | + return True |
| 34 | + |
| 35 | + new_num = list(num) |
| 36 | + while k: |
| 37 | + next_permutation(new_num, 0, len(new_num)) |
| 38 | + k -= 1 |
| 39 | + result = 0 |
| 40 | + for i in xrange(len(new_num)): |
| 41 | + if new_num[i] == num[i]: |
| 42 | + continue |
| 43 | + # // greedily move the one with the least cost from new_num to num without missing optimal cost |
| 44 | + for j in xrange(i+1, len(new_num)): |
| 45 | + if new_num[j] == num[i]: |
| 46 | + break |
| 47 | + result += j-i |
| 48 | + for j in reversed(xrange(i+1, j+1)): |
| 49 | + new_num[j], new_num[j-1] = new_num[j-1], new_num[j] |
| 50 | + return result |
0 commit comments