前言
感觉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 }