Golang-strings包

Golang-string包


前言

从零开始学习golang,发现很多包的函数都不太熟悉,之前写了一个com包的,准备啃一下常用内置包的源码,然后把用法都记录一下,加深一下记忆,顺便学习一下大佬们们造的轮子。只记录非私有的函数,golang版本1.14.6,会写点注释。

函数

1.Index(s, substr string) int

// Index returns the index of the first instance of substr in s, or -1 if substr is not present in s.
func Index(s, substr string) int {
	n := len(substr)
	switch {
	case n == 0:
		return 0
	case n == 1:
		return IndexByte(s, substr[0])
	case n == len(s):
		if substr == s {
			return 0
		}
		return -1
	case n > len(s):
		return -1
	//substr长度小于临界值
	case n <= bytealg.MaxLen:
		// Use brute force when s and substr both are small
		//如果s和substr都比较小,使用暴力破解算法
		//即从两个字符串的第一位开始比较,相同则比较下一位,不相同则用s的第二位比较substr的第一位依次类推直到查出结果或者循环结束返回-1
		if len(s) <= bytealg.MaxBruteForce {
			return bytealg.IndexString(s, substr)
		}
		//s长度较长,substr长度较小的使用其他的算法
		c0 := substr[0]
		c1 := substr[1]
		//i是s上的定位,表示在这之前,都不存在s[i] == substr[0]
		i := 0
		//t是临界值,如果循环判断到s[t-1]都还不等于substr[0],则s不包含substr,返回-1
		t := len(s) - n + 1
		fails := 0
		for i < t {
			if s[i] != c0 {
				// IndexByte is faster than bytealg.IndexString, so use it as long as
				// we're not getting lots of false positives.
				o := IndexByte(s[i:t], c0)
				//剩余未判断的s不包含substr[0],则s不包含substr,返回-1
				if o < 0 {
					return -1
				}
				//剩余未判断的s包含substr[0]。i指向该位置
				i += o
			}
			//上一个if条件不满足或者i已经指向下一个s[i] == substr[0]的位置
			//所以s[i] == substr[0],s[i+1] == substr[1]并且后续也相等的话,返回结果i
			if s[i+1] == c1 && s[i:i+n] == substr {
				return i
			}
			fails++
			i++
			// Switch to bytealg.IndexString when IndexByte produces too many false positives.
			//从第一位开始判断,当判断不成功的次数超过临界值的时候,转为使用bytealg.IndexString(暴力破解算法)
			if fails > bytealg.Cutover(i) {
				r := bytealg.IndexString(s[i:], substr)
				if r >= 0 {
					return r + i
				}
				return -1
			}
		}
		return -1
	}
	//substr长度大于临界值使用RabinKarp算法
	c0 := substr[0]
	c1 := substr[1]
	i := 0
	t := len(s) - n + 1
	fails := 0
	for i < t {
		if s[i] != c0 {
			o := IndexByte(s[i:t], c0)
			if o < 0 {
				return -1
			}
			i += o
		}
		if s[i+1] == c1 && s[i:i+n] == substr {
			return i
		}
		i++
		fails++
		//和上面只是fails临界值的判断条件和调用的函数不一样
		if fails >= 4+i>>4 && i < t {
			// See comment in ../bytes/bytes.go.
			j := indexRabinKarp(s[i:], substr)
			if j < 0 {
				return -1
			}
			return i + j
		}
	}
	return -1
}

//借用一下别人造的轮子: https://blog.csdn.net/seacowtech/article/details/79256299
//Rabin-Karp算法的思想:
//1.假设子串的长度为M,目标字符串的长度为N
//2.计算子串的hash值
//3.计算目标字符串中每个长度为M的子串的hash值(共需要计算N-M+1次)
//4.比较hash值
//5.如果hash值不同,字符串必然不匹配,如果hash值相同,还需要使用朴素算法再次判断
func indexRabinKarp(s, substr string) int {
	// Rabin-Karp search
	hashss, pow := hashStr(substr)
	n := len(substr)
	var h uint32
	for i := 0; i < n; i++ {
		h = h*primeRK + uint32(s[i])
	}
	if h == hashss && s[:n] == substr {
		return 0
	}
	for i := n; i < len(s); {
		h *= primeRK
		h += uint32(s[i])
		h -= pow * uint32(s[i-n])
		i++
		if h == hashss && s[i-n:i] == substr {
			return i - n
		}
	}
	return -1
}

未完待续…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Go 中,你可以使用 `==` 运算符来判断两个字符串是否完全匹配。例如: ``` s1 := "Hello, World" s2 := "Hello, World" if s1 == s2 { fmt.Println("The strings are equal.") } else { fmt.Println("The strings are not equal.") } ``` 上面的代码会输出 "The strings are equal.",因为两个字符串完全匹配。 注意,这种方法只能用于比较两个字符串的完全匹配,如果你想要进行模糊匹配(例如,忽略大小写,或者只匹配字符串的一部分),你可以使用 Go 的内置函数 `strings.EqualFold()` 或 `strings.Contains()`。 例如: ``` s1 := "Hello, World" s2 := "hello, world" if strings.EqualFold(s1, s2) { fmt.Println("The strings are equal (ignoring case).") } else { fmt.Println("The strings are not equal.") } if strings.Contains(s1, "World") { fmt.Println("s1 contains the string 'World'.") } ``` 上面的代码会输出 "The strings are equal (ignoring case)." 和 "s1 contains the string 'World'."。 ### 回答2: golangstrings提供了多种方法来处理字符串,其中括字符串的完全匹配。 要判断一个字符串是否与另一个字符串完全匹配,可以使用strings中的Equal方法。这个方法接收两个字符串作为参数,并返回一个布尔值,表示这两个字符串是否完全相同。 下面是一个使用Equal方法判断字符串是否完全匹配的示例代码: ```go package main import ( "fmt" "strings" ) func main() { str1 := "Hello" str2 := "Hello" if strings.EqualFold(str1, str2) { fmt.Println("字符串完全匹配") } else { fmt.Println("字符串不完全匹配") } } ``` 在这个示例中,我们定义了两个字符串变量str1和str2,并将它们分别赋值为"Hello"。然后,我们使用Equal方法判断这两个字符串是否完全匹配。如果它们完全相同,我们就打印"字符串完全匹配",否则打印"字符串不完全匹配"。 在实际应用中,字符串的完全匹配可以用于判断用户输入是否与特定字符串相等,或者判断两个字符串是否相同等场景。使用strings中的Equal方法,我们可以方便地实现这一功能。 ### 回答3: 在Golang中,可以使用strings中的函数来进行字符串的完全匹配。具体而言,可以使用strings中的EqualFold函数来判断两个字符串是否在不区分大小写的情况下完全匹配。 EqualFold函数的用法是:strings.EqualFold(str1, str2),其中str1和str2分别是要比较的两个字符串。如果两个字符串在不区分大小写的情况下完全匹配,该函数将返回true,否则将返回false。 除了EqualFold函数之外,还可以使用等号直接比较两个字符串,比如str1 == str2。这种方式只有当两个字符串完全相同(括大小写)时才返回true,否则返回false。 需要注意的是,strings中提供的函数只能进行简单的字符串比较,不能进行更为复杂的匹配操作。如果需要进行更复杂的匹配,可能需要使用正则表达式或其他相关的工具。 总之,在Golang中,可以使用strings.EqualFold函数或直接使用等号来判断两个字符串是否完全匹配。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值