diff --git a/problems/0028.实现strStr.md b/problems/0028.实现strStr.md index 91f8a524..cc73420b 100644 --- a/problems/0028.实现strStr.md +++ b/problems/0028.实现strStr.md @@ -894,7 +894,58 @@ var strStr = function (haystack, needle) { }; ``` +Swift 版本 +> 前缀表统一减一 + +```swift +func strStr(_ haystack: String, _ needle: String) -> Int { + + let s = Array(haystack), p = Array(needle) + guard p.count != 0 else { return 0 } + + // 2 pointer + var j = -1 + var next = [Int](repeating: -1, count: needle.count) + // KMP + getNext(&next, needle: p) + for i in 0 ..< s.count { + while j >= 0 && s[i] != p[j + 1] { + //不匹配之后寻找之前匹配的位置 + j = next[j] + } + if s[i] == p[j + 1] { + //匹配,双指针同时后移 + j += 1 + } + if j == (p.count - 1) { + //出现匹配字符串 + return i - p.count + 1 + } + } + return -1 +} + +//前缀表统一减一 +func getNext(_ next: inout [Int], needle: [Character]) { + + var j: Int = -1 + next[0] = j + + // i 从 1 开始 + for i in 1 ..< needle.count { + while j >= 0 && needle[i] != needle[j + 1] { + j = next[j] + } + if needle[i] == needle[j + 1] { + j += 1; + } + next[i] = j + } + print(next) +} + +``` -----------------------
diff --git a/problems/0077.组合.md b/problems/0077.组合.md index 6c74ab52..ef7031e3 100644 --- a/problems/0077.组合.md +++ b/problems/0077.组合.md @@ -405,7 +405,7 @@ class Solution: if len(path) == k: res.append(path[:]) return - for i in range(StartIndex, n-(k-len(path)) + 2): + for i in range(StartIndex, n + 1): path.append(i) backtrack(n, k, i+1) path.pop() @@ -414,7 +414,7 @@ class Solution: ``` 剪枝: -```python3 +```python class Solution: def combine(self, n: int, k: int) -> List[List[int]]: res=[] #存放符合条件结果的集合 @@ -423,7 +423,7 @@ class Solution: if len(path) == k: res.append(path[:]) return - for i in range(startIndex,n-(k-len(path))+2): #优化的地方 + for i in range(startIndex,n - (k - len(path)) + 2): #优化的地方 path.append(i) #处理节点 backtrack(n,k,i+1) #递归 path.pop() #回溯,撤销处理的节点 diff --git a/problems/二叉树的递归遍历.md b/problems/二叉树的递归遍历.md index 875e6169..0468b79b 100644 --- a/problems/二叉树的递归遍历.md +++ b/problems/二叉树的递归遍历.md @@ -409,5 +409,56 @@ int* postorderTraversal(struct TreeNode* root, int* returnSize){ } ``` +Swift: +前序遍历:(144.二叉树的前序遍历) +```Swift +func preorderTraversal(_ root: TreeNode?) -> [Int] { + var res = [Int]() + preorder(root, res: &res) + return res +} +func preorder(_ root: TreeNode?, res: inout [Int]) { + if root == nil { + return + } + res.append(root!.val) + preorder(root!.left, res: &res) + preorder(root!.right, res: &res) +} +``` + +中序遍历:(94. 二叉树的中序遍历) +```Swift +func inorderTraversal(_ root: TreeNode?) -> [Int] { + var res = [Int]() + inorder(root, res: &res) + return res +} +func inorder(_ root: TreeNode?, res: inout [Int]) { + if root == nil { + return + } + inorder(root!.left, res: &res) + res.append(root!.val) + inorder(root!.right, res: &res) +} +``` + +后序遍历:(145. 二叉树的后序遍历) +```Swift +func postorderTraversal(_ root: TreeNode?) -> [Int] { + var res = [Int]() + postorder(root, res: &res) + return res +} +func postorder(_ root: TreeNode?, res: inout [Int]) { + if root == nil { + return + } + postorder(root!.left, res: &res) + postorder(root!.right, res: &res) + res.append(root!.val) +} +``` -----------------------