433. 最小基因变化
分析
- 数据准备
- 将基因库
bank
存入一个哈希集合gene
中,方便快速判断某个基因序列是否有效 - 用哈希表
hash
记录每个基因序列的访问状态及其变化次数
- 将基因库
- 初始化 BFS
- 将起始基因序列
startGene
入队,设初始变化次数为0
- 将起始基因序列
- BFS 遍历
- 每次从队列中取出当前基因序列
s
,对其进行逐位变换。 - 枚举
8
个字符中的每一位,尝试将其替换为‘A’
、‘C’
、‘G’
或‘T’
- 对于每个生成的新基因序列
t
,若它在基因库中且未被访问过- 将其加入队列,并记录变化次数
hash[t] = hash[s] + 1
- 若
t == endGene
,则直接返回变化次数
- 将其加入队列,并记录变化次数
- 每次从队列中取出当前基因序列
- 结束条件:
- 如果 BFS 遍历完队列仍未找到
endGene
,则返回-1
- 如果 BFS 遍历完队列仍未找到
时间复杂度
- 每个基因序列有
8
个字符,每个字符有4
种变换,最多产生O(8 * 4 * n)
次尝试,其中n
是基因库的大小 - BFS 遍历每个基因序列一次,复杂度为
O(n)
总时间复杂度为 O(32n)
,即 O(n)
空间复杂度
- 哈希集合
gene
和hash
占用O(n)
空间 - 队列最多存储
O(n)
个基因序列
总空间复杂度为 O(n)
C++代码
|
|