给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从 0 开始)。如果不存在,则返回 -1。
// 1
``` go
func strStr(haystack string, needle string) int {
if len(needle) == 0 {
return 0
}
var i, j int
// i不需要到len-1
for i = 0; i < len(haystack)-len(needle)+1; i++ {
for j = 0; j < len(needle); j++ {
if haystack[i+j] != needle[j] {
break
}
}
// 判断字符串长度是否相等
if len(needle) == j {
return i
}
}
return -1
}
```
// 2
```go
func strStr1(haystack string, needle string) int {
if len(needle) == 0 {
return 0
}
var i int
for i = 0; i < len(haystack)-len(needle)+1; i++ {
if haystack[i:i+len(needle)] == needle{
return i
}
}
return -1
}
```
// main
```go
func main() {
var hay = "cdacdacdcdcdcdacbcdefdsaFdsavf";
var nee = "cde";
start_ts := time.Now()
var i int
for i=0; i<1000000; i++{
strStr(hay, nee)
}
fmt.Println(time.Since(start_ts))
start_ts = time.Now()
var j int
for j=0; j<1000000; j++{
strStr1(hay, nee)
}
fmt.Println(time.Since(start_ts))
}
```
结果:
strStr: 23.045706ms
strStr1: 55.945008ms
2比1慢了两倍,是因为底层在比较两个字符串比较慢吗?
更多评论
内建字符串比较==好像就是比较慢的,可以尝试着换成`strings.Compare(haystack[i:i+len(needle)],needle)`试,而且方法二的逻辑应该不算错,可以就是递归使用判断前缀的方法来判断子串问题,如果想继续深入分析,可以将两个方法整成汇编,然后从汇编层面倒推出string的==方法的伪代码来进行判断。
#3