面试问题浓缩总结 面试问题浓缩总结
  • Go
  • Java
  • C/C++
  • JavaScript/HTML
  • MySQL
  • Redis
  • MongoDB
  • 操作系统
  • 计算机网络
  • spring全家桶
  • mybatis
  • 中间件
  • 软件相关
  • 系统相关
  • 算法
  • 数据结构
  • 设计模式
  • CMU硕士经典100题
  • 剑指offer
  • 重点手撕代码
  • 程序员面试金典
  • 3月
  • 4月
  • 智力题
  • 业务问题
  • 一些技术
  • 安全相关
APP下载 (opens new window)
GitHub (opens new window)
  • Go
  • Java
  • C/C++
  • JavaScript/HTML
  • MySQL
  • Redis
  • MongoDB
  • 操作系统
  • 计算机网络
  • spring全家桶
  • mybatis
  • 中间件
  • 软件相关
  • 系统相关
  • 算法
  • 数据结构
  • 设计模式
  • CMU硕士经典100题
  • 剑指offer
  • 重点手撕代码
  • 程序员面试金典
  • 3月
  • 4月
  • 智力题
  • 业务问题
  • 一些技术
  • 安全相关
APP下载 (opens new window)
GitHub (opens new window)
  • 算法

  • 数据结构

  • 设计模式

  • CMU硕士经典100题

    • 贪心算法
    • 双指针法
    • 二分查找
    • 各种排序
    • 各种搜索
    • 动态规划
    • 分治法解题
    • 数学问题
    • 位运算
    • 数据结构
    • 字符串
      • 基本概念
      • 字符串比较
        • 有效的字母异位词
        • 同构字符串
        • 回文子串
      • 字符串理解
        • 基本计算器II
      • 字符串匹配
        • 实现strStr()
    • 链表
    • 树
    • 图
    • 更加复杂的数据结构
  • 剑指offer

  • 重点手撕代码

  • 程序员面试

  • CodeTop企业题库

  • 笔试题目

  • 算法和数据结构
  • CMU硕士经典100题
小游
2021-03-24
基本概念
字符串比较
有效的字母异位词
同构字符串
回文子串
字符串理解
基本计算器II
字符串匹配
实现strStr()

字符串

# 基本概念

字串 是在字符串中,取出一块(连续的),如: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

# 同构字符串

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)

image-20210327184737490

这题目分为解析数字,然后进行计算。因为乘除的优先级更高,所以我们需要先想办法暂存数据然后进行计算,我们这里可以先不进行计算,先用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

# 字符串匹配

# 实现strStr()

28. 实现 strStr() - 力扣(LeetCode) (leetcode-cn.com) (opens new window)

image-20210327190211323

这个其实就是字符串搜索算法了,字符串搜索有两种,一是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

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
编辑 (opens new window)
上次更新: 2021/03/27, 21:55:03
数据结构
链表

← 数据结构 链表→

Theme by Vdoing | Copyright © 2021-2025 小游
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式