 字符串
          字符串
        
  # 基本概念
字串 是在字符串中,取出一块(连续的),如:pik, ach, kac等
子序列 指的是从字符串中,顺序取出字符,但是可以不连续:如:pau, kch, icu等
# 字符串比较
# 有效的字母异位词
242. 有效的字母异位词 - 力扣(LeetCode) (leetcode-cn.com) (opens new window)
func isAnagram(s string, t string) bool {
   // 如果长度不一样,那么直接退出
   if len(s) != len(t) {
      return false
   }
   // 因为只有小写字母,所以我们可以只创建一个大小为26的数组
   a:=make([]int,26)
   for k:=range s{
      // 如果两个字符串相等的话,那么一个++一个--后,整个数组应该是为0的
      a[s[k]-'a'] ++
      a[t[k]-'a'] --
   }
   // 最后只要发现一个字符串不为0,那么我们就直接返回false
   for _,v:=range a{
      if v!=0 {
         return false
      }
   }
   return true
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 同构字符串
242. 有效的字母异位词 - 力扣(LeetCode) (leetcode-cn.com) (opens new window)
# 回文子串
647. 回文子串 - 力扣(LeetCode) (leetcode-cn.com) (opens new window)
# 字符串理解
# 基本计算器II
227. 基本计算器 II - 力扣(LeetCode) (leetcode-cn.com) (opens new window)

这题目分为解析数字,然后进行计算。因为乘除的优先级更高,所以我们需要先想办法暂存数据然后进行计算,我们这里可以先不进行计算,先用right暂存,当遇到高优先级的比如*或者/这个时候我们就可以直接计算了
func calculate(s string) int {
   i:=0
   return parseExpr(s,&i)
}
func parseExpr(s string,i *int) int {
   op:="+"
   left,right:=0,0
   // 使用i指针来记录当前的位置
   for *i< len(s) {
      // 首先确保我们的字符串不是空格
      if string(s[*i]) != " " {
         // 然后我们就解析数字,这我们i会解析到操作符所在的位置
         n:=parseNum(s,i)
         // 下面判断操作类型,并进行不同的计算
         switch op {
         case "+":
            // 这里我们让right等于n,相当于暂存
            left+=right;right=n
         case "-":
            left+=right;right=-n
         case "*":
            // 如果是*的话优先级更高,优先计算
            right*=n
         case "/":
            right/=n
         }
         // 确保i不越界的情况下我们获取当前的操作符
         if *i < len(s) {
            op = string(s[*i])
         }
      }
      *i++
   }
   return left+right
}
// 解析数字
func parseNum(s string,i *int) int {
   n:=0
   // 我们这里不断一位一位进行解析,直到解析到操作符为止
   for *i< len(s) && unicode.IsDigit(rune(s[*i])) {
      n = 10*n + (int(s[*i]) - 48)
      *i++
   }
   return n
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# 字符串匹配
# 实现strStr()
28. 实现 strStr() - 力扣(LeetCode) (leetcode-cn.com) (opens new window)

这个其实就是字符串搜索算法了,字符串搜索有两种,一是BF算法,二是KMP算法
BF算法如下,调了好久。。。我太菜了,害
func strStr(haystack string, needle string) int {
   i,j:=0,0
   h,n:=len(haystack),len(needle)
   if needle==""{
      return 0
   }
   if n>h {
      return -1
   }
   for i < h {
      if haystack[i]==needle[j] {
         tmp:=i
         for tmp < h && j< n && haystack[tmp] == needle[j] {
            tmp++
            j++
         }
         if j > n-1 {
            return i
         } else {
             j=0
         }
      }
      i++
   }
   return -1
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
KMP解法如下,现在还太菜了,等我研究透了在回看
func strStr(haystack string, needle string) int {
	k,n,p:=-1,len(haystack),len(needle)
	// 如果need为0,那么我们直接返回0
	if p == 0 {
		return 0
	}
	// 初始化next数组
	next:=make([]int,p)
	for i := 0; i < p; i++ {
		next[i] = -1
	}
	// 计算next数组
	calNext(needle,next)
	// 开始进行字符串查找
	for i := 0; i < n; i++ {
		// k表示needle的位置,如果为-1,那么我们就先不计算
		for k > -1 && needle[k+1] != haystack[i] {
			k=next[k]
		}
		// 这里我们
		if needle[k+1] == haystack[i] {
			k++
		}
		if k == p-1 {
			return i-p+1
		}
	}
	return -1
}
// 计算next数组
// 简单介绍一next数组
// ababa 生成的是 -1 -1 0 1 2
func calNext(needle string,next []int)  {
	// 默认情况下,我们的next数组下标为-1(第一个一定是-1)
	p:=-1
	// 然后我们从1开始往后面进行计算
	for j := 1; j < len(needle); j++ {
		// 这里我们使用回溯来计算next数组
		for p > -1 && needle[p+1] != needle[j] {
			p = next[p]
		}
		// 当有一位相同时,p要不断++
		if needle[p+1]==needle[j] {
			p++
		}
		next[j] = p
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
编辑  (opens new window)
  上次更新: 2021/03/27, 21:55:03
