笔试——Day12
文章目录
- 第一题
- 题目
- 思路
- 代码
- 第二题
- 题目:
- 思路
- 代码
- 第三题
- 题目:
- 思路
- 代码
第一题
题目
删除公共字符
思路
模拟:
遇到需要删除的字符,则不添加到结果中
代码
第二题
题目:
两个链表的第一个公共结点
思路
模拟:
- 先计算两个链表的长度
- 再让长的先走差值步
- 最后同时走,走到结束,如果没有相遇则为空
代码
第三题
题目:
mari和shiny
思路
动态规划——多状态的线性 dp
状态表示:
s[i]
表示:字符串[0, i]
中,有多少个s
h[i]
表示:字符串[0, i]
中,有多少个sh
y[i]
表示:字符串[0, i]
中,有多少个shy
状态转移方程:
s[i]
:
str[i] == 's'
,s[i - 1] + 1
str[i] != 's'
,s[i - 1]
h[i]
:
str[i] == 'h'
,s[i - 1] + h[i - 1]
str[i] != 'h'
,h[i - 1]
y[i]
:
str[i] == 'y'
,h[i - 1] + y[i - 1]
str[i] != 'y'
,y[i - 1]
结果返回:
y[n - 1]
优化
我们发现只有当当前字符为有效时(即shy),才会相加,否则等于之前的值;
s
:当前's'
的数量h
:当前'sh'
子序列的数量y
:当前'shy'
子序列的数量