题目1: 93.复原IP地址
讲解
leetcode
class Solution {
var result = [String]()
var set = [String]()
func restoreIpAddresses(_ s: String) -> [String] {
restoreIpRecursive(s, 0, "")
return result
}
func restoreIpRecursive(_ s: String, _ start: Int, _ sumStr: String) {
if set.count >= 4 {
if set.count == 4, sumStr == s {
result.append(set.joined(separator: "."))
}
return
}
for i in start..<s.count {
if (i - start + 1) > 3 { break }
let startIndex = s.index(s.startIndex, offsetBy: start)
let endIndex = s.index(s.startIndex, offsetBy: i + 1)
let subString = String(s[startIndex..<endIndex])
if !isValidIpPart(subString) {
break
}
set.append(subString)
restoreIpRecursive(s, i + 1, sumStr + subString)
set.removeLast()
}
}
func isValidIpPart(_ s: String) -> Bool {
if s.count > 3 { return false }
if s.count > 1, Int(String(s.first!)) ?? 0 == 0 { return false }
let num = Int(s) ?? 0
if num == 0, s.count != 1 {
return false
}
return num <= 255
}
}
题目2:78.子集
讲解
leetcode
class Solution {
var result = [[Int]]()
var set = [Int]()
func subsets(_ nums: [Int]) -> [[Int]] {
subsetsRecursive(nums, 0)
return result
}
func subsetsRecursive(_ nums: [Int], _ start: Int) {
result.append(set)
if start == nums.count { return }
for i in start..<nums.count {
set.append(nums[i])
subsetsRecursive(nums, i + 1)
set.removeLast()
}
}
}
题目3:90.子集II
讲解
leetcode
class Solution {
var result = [[Int]]()
var set = [Int]()
func subsetsWithDup(_ nums: [Int]) -> [[Int]] {
subsetsRecursive(nums.sorted(), 0)
return result
}
func subsetsRecursive(_ nums: [Int], _ start: Int) {
result.append(set)
if start >= nums.count { return }
for i in start..<nums.count {
if i > start, nums[i] == nums[i - 1] { continue }
set.append(nums[i])
subsetsRecursive(nums, i + 1)
set.removeLast()
}
}
}