前言
感觉T3才应该是hard,其他的都挺简单的
第一题
6056.字符串中最大的3位相同数字
6056.字符串中最大的3位相同数字
题解
题目:求字符串中连续3个相等并且较大的子字符串
思路:模拟即可
代码
func largestGoodInteger(num string) string {
for c := '9'; c >= '0'; c-- {
s := strings.Repeat(string(c), 3)
if strings.Contains(num, s) {
return s
}
}
return ""
}
第二题
6057.统计值等于子树平均值的节点数
6057.统计值等于子树平均值的节点数
题解
题目:找到 节点及子树的累加 除以节点个数 = 该节点值 的节点的个数
思路:递归找到左右子树的累加,以及个数
代码
func averageOfSubtree(root *TreeNode) (ans int) {
var dfs func(root *TreeNode) (v int, num int)
dfs = func(root *TreeNode) (v int, num int) {
if root == nil {
return 0, 0
}
v1, n1 := dfs(root.Left)
v2, n2 := dfs(root.Right)
sumVal, sumNum := v1+v2+root.Val, n1+n2+1
if sumVal/sumNum == root.Val {
ans++
}
return sumVal, sumNum
}
dfs(root)
return ans
}
第三题
6058.统计打字方案数
6058.统计打字方案数
题解
题目:九键打字法,给你一传数字,返回能够组合出多少种字符串的数量
思路:
dp[i]:相同字符长为i对应的文字信息种类
对于字符不为7或9的情况:
将末尾1个字符看作一个字母,则dp[i]=dp[i-1]
将末尾2个字符看作一个字母,则dp[i]=dp[i-2]
将末尾3个字符看作一个字母,则dp[i]=dp[i-3]
dp[i] = (dp[i-1] + dp[i-2] + dp[i-3])
同理字符为7或9的情况
dp[i] = (dp[i-1] + dp[i-2] + dp[i-3] + dp[i-4])
1.预处理所有长度对应的种类数
2.将字符串分成字符串相等的一部分一部分
3.算出来的相等即可
代码
func countTexts(pressedKeys string) int {
var mod int = 1e9 + 7
dp1 := [1e5 + 1]int{0, 1, 2, 4}
dp2 := [1e5 + 1]int{1, 1, 2, 4}
for i := 4; i <= 1e5; i++ {
dp1[i] = (dp1[i-1] + dp1[i-2] + dp1[i-3]) % mod
dp2[i] = (dp2[i-1] + dp2[i-2] + dp2[i-3] + dp2[i-4]) % mod
}
ans, cnt := 1, 0
pressedKeys = pressedKeys + "-"
for i := 0; i < len(pressedKeys); i++ {
if i == len(pressedKeys)-1 {
break
}
if pressedKeys[i] != pressedKeys[i+1] {
cnt++
if pressedKeys[i] != '7' && pressedKeys[i] != '9' {
ans *= dp1[cnt]
} else {
ans *= dp2[cnt]
}
ans %= mod
cnt = 0
} else {
cnt++
}
}
return ans
}
第四题
6059.检查是否有合法括号字符串路径
6059.检查是否有合法括号字符串路径
题解
题目:从左上角开始走到右下角,每次只能向右或者向左,每个格子是(或者),问走的路径是否合法(合法情况:()()或者(())或者((())) )
思路:
1.对于(,则count加1,对于)则count减1。想要合法,则count=0
2.如果直接暴力会超时,需要剪枝
1.如果左上是),或者右下是(,必定不合法
2.如果半个周长不是偶数,必定不合法,因为左右括号相加是偶数
3.如果count大于半个周长或者count小于0,必定不合法
3.如果只剪了上面的3个枝,还是会超时,我们需要考虑重复的子问题
1.如果走到了(x,y),并且count数量一样,
则对于x,y,count的下一步计算都是重复的
所以用一个map记录,进行剪枝
代码
type pair struct {
count, x, y int
}
func hasValidPath(grid [][]byte) bool {
n, m := len(grid)-1, len(grid[0])-1
flag := false
mp := make(map[pair]bool)
var dfs func(count, x, y int)
dfs = func(count, x, y int) {
if !mp[pair{count, x, y}] {
mp[pair{count, x, y}] = true
} else {
return
}
if grid[x][y] == '(' {
count++
} else {
count--
}
if count > (n+m+1)/2 || count < 0 || flag == true {
return
}
if count == 0 && x == n && y == m {
flag = true
return
}
if x+1 <= n {
dfs(count, x+1, y)
}
if y+1 <= m {
dfs(count, x, y+1)
}
}
if grid[0][0] == ')' || grid[n][m] == '(' || (n+m+1)%2 != 0 {
return false
}
dfs(0, 0, 0)
return flag
}
|