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++代码
|
|