Skip to content

Commit

Permalink
Merge pull request youngyangyang04#944 from ShrinkLynn/master
Browse files Browse the repository at this point in the history
[ShrinkLynn] 0028 add swift version
  • Loading branch information
youngyangyang04 authored Dec 19, 2021
2 parents 7bcd716 + a981cee commit 3992a20
Showing 1 changed file with 51 additions and 0 deletions.
51 changes: 51 additions & 0 deletions problems/0028.实现strStr.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}

```

-----------------------
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>

0 comments on commit 3992a20

Please sign in to comment.