File tree Expand file tree Collapse file tree 1 file changed +56
-0
lines changed Expand file tree Collapse file tree 1 file changed +56
-0
lines changed Original file line number Diff line number Diff line change 1+ /**
2+ * Question Link: https://leetcode.com/problems/next-palindrome-using-same-digits/
3+ * Primary idea: Figure out the first half's next permutation, then double it to the result.
4+ *
5+ * Time Complexity: O(n), Space Complexity: O(1)
6+ *
7+ */
8+
9+ class NextPalindromeUsingSameDigits {
10+ func nextPalindrome( _ num: String ) -> String {
11+ let num = Array ( num)
12+ var firstHalf = num [ 0 ..< num. count / 2 ] . compactMap { Int ( String ( $0) ) }
13+
14+ if num. count <= 1 || !nextPermutation( & firstHalf) {
15+ return " "
16+ }
17+
18+ let firstHalfStr = firstHalf. map { String ( $0) } . joined ( )
19+
20+ if num. count % 2 == 0 {
21+ return firstHalfStr + firstHalfStr. reversed ( )
22+ } else {
23+ return firstHalfStr + String( num [ num. count / 2 ] ) + firstHalfStr. reversed ( )
24+ }
25+ }
26+
27+ private func nextPermutation( _ nums: inout [ Int ] ) -> Bool {
28+ var violateIdx = - 1
29+
30+ for i in ( 1 ..< nums. count) . reversed ( ) {
31+ if nums [ i] > nums [ i - 1 ] {
32+ violateIdx = i - 1
33+ break
34+ }
35+ }
36+
37+ if violateIdx == - 1 {
38+ nums. reverse ( )
39+ return false
40+ }
41+
42+ for i in ( ( violateIdx + 1 ) ..< nums. count) . reversed ( ) {
43+ if nums [ i] > nums [ violateIdx] {
44+ swap ( & nums, i, violateIdx)
45+ break
46+ }
47+ }
48+
49+ nums [ ( violateIdx + 1 ) ... ] . reverse ( )
50+ return true
51+ }
52+
53+ private func swap( _ nums: inout [ Int ] , _ l: Int , _ r: Int ) {
54+ ( nums [ l] , nums [ r] ) = ( nums [ r] , nums [ l] )
55+ }
56+ }
You can’t perform that action at this time.
0 commit comments