手刷算法day1(1)(go语言实践)
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。
解读题目:
给你两个字符串,用一个来匹配另外一个,如果他们是包含关系返回下表范围(从0开始),不包含则返回-1
知识点解读:
这个算法就有点类似正则表达式,不过正则表达式的算法特别复杂。
补充一个go语言的一个小知识点,字符串的底层是数组,实现结构被官方设计的时候写死了,为什么要写死?。。。所以面试的时候回为什么go语言的字符串不可以修改?
Go中的字符串的数据结构体是由一个指针和长度组成的结构体,该指针指向的一个切片才是真正的字符串值
个人猜想,当遇到一个非常长的字符时,这样做使得string变得非常轻量,可以很方便的进行传递而不用担心内存拷贝。虽然在Go中,不管是引用类型还是值类型参数传递都是值传递。但指针明显比值传递更节省内存。还有一点就是避免线程安全事故。
解题思路:(归类:暴力for匹配)
遍历给定字符串字符,判断以当前字符开头字符串是否等于目标字符串
代码实现如下
func strStr(haystack string, needle string) int {
//判断needle字符串长度是不是空,为空直接返回0
if len(needle)==0{
return 0
}
//定义两个指针
var i , j int
//外循环,这里为什么要+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
}
//此时只有j的累加数等于len(needle),他们才是包含关系
if len(needle)==j{
return i
}
}
}
//两层遍历结束,说明不包含,返回-1
return -1
}

浙公网安备 33010602011771号