持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
- start.length == 8
- end.length == 8
- 0 <= bank.length <= 10
- bank[i].length == 8
- start、end 和 bank[i] 仅由字符 ['A', 'C', 'G', 'T'] 组成
二、思路分析:
我们读取本题题意,要求对start字符串字母进行变化,计算出得到end字符串的变化次数。并且start字符串每一次变化的字符串,必须在bank列表里,才是有效的一次变动,所以我们可以明确如下几点:
- bank 列表存放有效的字符串,每个字符串长度都为8,且字符都由['A', 'C', 'G', 'T']组成
- start 字符串每一次变化,只变更一个字符
- start 字符串变化为 end 字符串存在多种路径,但是要返回最少的次数
明确了题目的要求后,我们知道要start字符串的元素进行遍历,这个时候需要使用BFS方法
可能对于刚刚接触到的菜鸟比如我,什么是BFS遍历?
- BFS是广度优先算法,属于一种盲目算法
- 该算法的目的:遍历所有的节点,知道找到结果为止
- 使用队列来添加已遍历的节点
- 定义队列que,初始化记录gene,step = start,0
- 循环对start字符串中的字符串进行每一次更改("ACGT")得到的newgene,都需要判断在bank列表中
- 如果newgene在bank中,则que把newgene添加到列表,步骤➕1,bank去掉newgene
- que列表推出添加newgene,如果newgene与end相等,则返回step
- 直到que为空,如果仍然没有找到有效的,则返回-1
我们借助collections.deque()形式实现,python代码如下:
class Solution(object):
def minMutation(self, start, end, bank):
"""
:type start: str
:type end: str
:type bank: List[str]
:rtype: int
"""
bfs = collections.deque()
bfs.append((start, 0))
bankset = set(bank)
while bfs:
gene, step = bfs.popleft()
if gene == end:
return step
for i in range(len(gene)):
for x in "ACGT":
newGene = gene[:i] + x + gene[i+1:]
if newGene in bank and newGene != gene:
bfs.append((newGene, step + 1))
bank.remove(newGene)
return -1
三、总结:
本题使用BFS思想,需要借助collection.deque()来实现,start字符串的字符进行"ACGT"变更,符合bank列表中,则添加到队列中,并且bank列表中删除遇到过的字符串。
- 时间复杂度O(N*L),N 为bank列表的长度,L为基因长度
- 空间复杂度O(N)
以上是本期内容,欢迎大佬们点赞评论,下期见~~~