-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathContents.swift
66 lines (56 loc) · 1.96 KB
/
Contents.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
// LeetCode: https://leetcode.com/problems/custom-sort-string/
import XCTest
class Solution {
func customSortString(_ S: String, _ T: String) -> String {
var dict = [Character : Int]()
for (idx, ch) in S.enumerated() {
dict[ch] = idx
}
var output = Array(T)
output = sort(output, 0, output.count-1, dict)
return String(output)
}
private func sort(_ current: [Character], _ start: Int, _ end: Int, _ dict: [Character : Int]) -> [Character] {
if start == end {
return [current[start]]
}
let mid = start + (end-start)/2
let left = sort(current, start, mid, dict)
let right = sort(current, mid+1, end, dict)
var leftIdx = 0
var rightIdx = 0
var output = [Character]()
while leftIdx < left.count && rightIdx < right.count {
if let leftPos = dict[left[leftIdx]], let rightPos = dict[right[rightIdx]] {
if leftPos < rightPos {
output.append(left[leftIdx])
leftIdx += 1
} else {
output.append(right[rightIdx])
rightIdx += 1
}
} else if let leftPos = dict[left[leftIdx]] {
output.append(left[leftIdx])
leftIdx += 1
} else {
output.append(right[rightIdx])
rightIdx += 1
}
}
if leftIdx < left.count {
output.append(contentsOf: Array(left[leftIdx..<left.count]))
} else {
output.append(contentsOf: Array(right[rightIdx..<right.count]))
}
return output
}
}
class Tests: XCTestCase {
let s = Solution()
func testSample1() {
let input = ("cba", "abcd")
let expected = "cbad"
XCTAssertEqual(expected, s.customSortString(input.0, input.1))
}
}
Tests.defaultTestSuite.run()