mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-08 00:43:04 +08:00
Update 0028.实现strStr.md
This commit is contained in:
@ -692,107 +692,66 @@ class Solution {
|
|||||||
```
|
```
|
||||||
|
|
||||||
Python3:
|
Python3:
|
||||||
(版本一)前缀表(不减一)
|
(版本一)前缀表(减一)
|
||||||
|
```python
|
||||||
|
class Solution:
|
||||||
|
def getNext(self, next, s):
|
||||||
|
j = -1
|
||||||
|
next[0] = j
|
||||||
|
for i in range(1, len(s)):
|
||||||
|
while j >= 0 and s[i] != s[j+1]:
|
||||||
|
j = next[j]
|
||||||
|
if s[i] == s[j+1]:
|
||||||
|
j += 1
|
||||||
|
next[i] = j
|
||||||
|
|
||||||
|
def strStr(self, haystack: str, needle: str) -> int:
|
||||||
|
if not needle:
|
||||||
|
return 0
|
||||||
|
next = [0] * len(needle)
|
||||||
|
self.getNext(next, needle)
|
||||||
|
j = -1
|
||||||
|
for i in range(len(haystack)):
|
||||||
|
while j >= 0 and haystack[i] != needle[j+1]:
|
||||||
|
j = next[j]
|
||||||
|
if haystack[i] == needle[j+1]:
|
||||||
|
j += 1
|
||||||
|
if j == len(needle) - 1:
|
||||||
|
return i - len(needle) + 1
|
||||||
|
return -1
|
||||||
|
```
|
||||||
|
(版本二)前缀表(不减一)
|
||||||
|
|
||||||
```python
|
```python
|
||||||
class Solution:
|
class Solution:
|
||||||
|
def getNext(self, next: List[int], s: str) -> None:
|
||||||
|
j = 0
|
||||||
|
next[0] = 0
|
||||||
|
for i in range(1, len(s)):
|
||||||
|
while j > 0 and s[i] != s[j]:
|
||||||
|
j = next[j - 1]
|
||||||
|
if s[i] == s[j]:
|
||||||
|
j += 1
|
||||||
|
next[i] = j
|
||||||
|
|
||||||
def strStr(self, haystack: str, needle: str) -> int:
|
def strStr(self, haystack: str, needle: str) -> int:
|
||||||
if len(needle) == 0:
|
if len(needle) == 0:
|
||||||
return 0
|
return 0
|
||||||
next = self.getNext(needle)
|
next = [0] * len(needle)
|
||||||
|
self.getNext(next, needle)
|
||||||
j = 0
|
j = 0
|
||||||
for i in range(len(haystack)):
|
for i in range(len(haystack)):
|
||||||
while j >= 1 and haystack[i] != needle[j]:
|
while j > 0 and haystack[i] != needle[j]:
|
||||||
j = next[j-1]
|
j = next[j - 1]
|
||||||
if haystack[i] == needle[j]:
|
if haystack[i] == needle[j]:
|
||||||
j += 1
|
j += 1
|
||||||
if j == len(needle):
|
if j == len(needle):
|
||||||
return i - len(needle) + 1
|
return i - len(needle) + 1
|
||||||
return -1
|
return -1
|
||||||
|
|
||||||
def getNext(self, needle):
|
|
||||||
next = [0] * len(needle)
|
|
||||||
j = 0
|
|
||||||
next[0] = j
|
|
||||||
for i in range(1, len(needle)):
|
|
||||||
while j >= 1 and needle[i] != needle[j]:
|
|
||||||
j = next[j-1]
|
|
||||||
if needle[i] == needle[j]:
|
|
||||||
j += 1
|
|
||||||
next[i] = j
|
|
||||||
return next
|
|
||||||
```
|
|
||||||
(版本二)前缀表(减一)
|
|
||||||
```python
|
|
||||||
class Solution:
|
|
||||||
def strStr(self, haystack: str, needle: str) -> int:
|
|
||||||
a = len(needle)
|
|
||||||
b = len(haystack)
|
|
||||||
if a == 0:
|
|
||||||
return 0
|
|
||||||
next = self.getnext(a,needle)
|
|
||||||
p=-1
|
|
||||||
for j in range(b):
|
|
||||||
while p >= 0 and needle[p+1] != haystack[j]:
|
|
||||||
p = next[p]
|
|
||||||
if needle[p+1] == haystack[j]:
|
|
||||||
p += 1
|
|
||||||
if p == a-1:
|
|
||||||
return j-a+1
|
|
||||||
return -1
|
|
||||||
|
|
||||||
def getnext(self,a,needle):
|
|
||||||
next = ['' for i in range(a)]
|
|
||||||
k = -1
|
|
||||||
next[0] = k
|
|
||||||
for i in range(1, len(needle)):
|
|
||||||
while (k > -1 and needle[k+1] != needle[i]):
|
|
||||||
k = next[k]
|
|
||||||
if needle[k+1] == needle[i]:
|
|
||||||
k += 1
|
|
||||||
next[i] = k
|
|
||||||
return next
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
(版本三)前缀表(减一)
|
(版本三)暴力法
|
||||||
|
|
||||||
|
|
||||||
```python
|
|
||||||
class Solution:
|
|
||||||
def strStr(self, haystack: str, needle: str) -> int:
|
|
||||||
a = len(needle)
|
|
||||||
b = len(haystack)
|
|
||||||
if a == 0:
|
|
||||||
return 0
|
|
||||||
i = j = 0
|
|
||||||
next = self.getnext(a, needle)
|
|
||||||
while(i < b and j < a):
|
|
||||||
if j == -1 or needle[j] == haystack[i]:
|
|
||||||
i += 1
|
|
||||||
j += 1
|
|
||||||
else:
|
|
||||||
j = next[j]
|
|
||||||
if j == a:
|
|
||||||
return i-j
|
|
||||||
else:
|
|
||||||
return -1
|
|
||||||
|
|
||||||
def getnext(self, a, needle):
|
|
||||||
next = ['' for i in range(a)]
|
|
||||||
j, k = 0, -1
|
|
||||||
next[0] = k
|
|
||||||
while(j < a-1):
|
|
||||||
if k == -1 or needle[k] == needle[j]:
|
|
||||||
k += 1
|
|
||||||
j += 1
|
|
||||||
next[j] = k
|
|
||||||
else:
|
|
||||||
k = next[k]
|
|
||||||
return next
|
|
||||||
```
|
|
||||||
|
|
||||||
(版本四)暴力法
|
|
||||||
```python
|
```python
|
||||||
class Solution(object):
|
class Solution(object):
|
||||||
def strStr(self, haystack, needle):
|
def strStr(self, haystack, needle):
|
||||||
@ -807,7 +766,7 @@ class Solution(object):
|
|||||||
return i
|
return i
|
||||||
return -1
|
return -1
|
||||||
```
|
```
|
||||||
(版本五)使用 index
|
(版本四)使用 index
|
||||||
```python
|
```python
|
||||||
class Solution:
|
class Solution:
|
||||||
def strStr(self, haystack: str, needle: str) -> int:
|
def strStr(self, haystack: str, needle: str) -> int:
|
||||||
@ -816,7 +775,7 @@ class Solution:
|
|||||||
except ValueError:
|
except ValueError:
|
||||||
return -1
|
return -1
|
||||||
```
|
```
|
||||||
(版本六)使用 find
|
(版本五)使用 find
|
||||||
```python
|
```python
|
||||||
class Solution:
|
class Solution:
|
||||||
def strStr(self, haystack: str, needle: str) -> int:
|
def strStr(self, haystack: str, needle: str) -> int:
|
||||||
|
Reference in New Issue
Block a user