获得徽章 17
- 809. 情感丰富的文字
思路:
关键是如何判断一个字符串扩张后能否变为另一个字符串. 可以将两个字符串压缩存储, 然后逐位对比压缩字符的个数.
比如: 压缩结果保存为key, 压缩字符的个数顺序添加到counts数组
heeellooo ==> { key : helo, counts01: [1,3,2,3]}
hello ===> {key: helo, counts02: [1,1,2,1]}
如果压缩后的key不相等, 肯定是无法扩张的. 如果key相等,逐位对比两者的counts数组(即每个压缩字符的压缩个数), 很明显, 只有在 counts01[i] 不等于 counts02[i] 情况下, 然后 counts01[i] >= 3 并且 counts01[i] > counts02[i] 才说明该字符hello[i]是可以扩张的展开评论点赞 - 680. 验证回文字符串 Ⅱ
思路:
正常判断是否是回文字符串, 只需要双指针i和j同时往内扫判断arr[i]和arr[j]是否相等即可.但是这里有一次容错机会(即最多允许删除一个字符), 所以当遇到第一对i和j不相等时, 可以跳过i或者跳过j然后再去判断剩余的区间[i+1,j]或者[i,j-1]中是否能继续构成回文字符串即可.展开评论点赞 - 553. 最优除法
思路[O(N)]: 数学证明
假设要最大化 a/b/c/d, 得最小化 b/c/d, 而 b/c/d 有两种添加括号的组合情况:
分别是 b/(c/d) 和 (b/c)/d, 乍一看好像不知道哪个表达式比较小, 直接对两个表达式进行简化:
```
1、b/(c/d) = (b*d)/c
2、(b/c)/d = b/c/d = b / (c * d)
然后两边消去b最终即
d/c 和 1 / (c * d), 因为 d 是 大于2的, 所以 d/c < 1 / (c * d), 所以 第二种括号组合的结果是最小化的 ,也就是把后半部分作为一个整体对于整个结果是最大的
所以 对于 a/b/c/d/e/f... 的表达式, 结果是 a/(b/c/d/e/f...) 才是最大化
```展开评论点赞