问题背景
输入一个字符串,字符串中仅含有+
、-
、?
三种字符。其中?
既可以变成+
又可以变成-
,比如+-?
的结果是+-+
和+--
两种字符。那么请输出?-+??-
的结果。
DFS(深度优先搜索)
DFS的常用模板(伪代码):
def dfs(deep):
if 判断条件: # 在这里进行递归的退出
return
for 某条内容 in 遍历内容: # 进行遍历,例如图中访问每一个满足某一条件的节点
if 判断是否未访问 and 满足其它给出的条件:
其它对应操作
设置为已访问
dfs(deep+1) # 递归调用下一深度
设置为未访问(对于回溯问题)
其它对应操作
分析
本题是一个抽象的搜索问题,可以通过思考将问题简化、转换为便于理解的实际问题,进而先将核心功能实现。
首先分析输入字符串中的+
、-
对结果没有影响,而是?
字符。如果有一个?
字符,那么会输出['+', '-']
两个结果;如果是有两个?
字符,那么会输出['++', '+-', '--', '-+']
四种结果。因此影响输出的自变量是?
字符的个数。比如,一个?
会分裂一次得到+
、-
,而两个?
时分裂一次得到的+
、-
会继续分裂,而最后输出的结果即为分裂的路径。?
字符的个数是分裂的次数,也就是搜索问题中递归的深度。
那么接下来实现一个简化的功能。
- 给定递归的深度
n
,那么任意一条路径最长为n
,路径是否走过对应的标记也是n
,生成p[]
、mark[]
两个列表(数组)。 - 整个程序运行从初始深度
deep = 0
开始。 - 比如
n = 1
,当初始深度0这一层查找完成后进入下一层查找dfs(deep + 1)
,一次成功的查找(走到头)的判定是当前的深度deep = 1
到达最深深度n
。 - 那么将
p[]
中存储的路径输出,函数返回结果。(需要注意的是return
关键字后面可以随意填写,使用return
的目的仅仅是结束当前函数,返回值也不会用在整个程序中,真正需要的值是p[]
中存储的路径) - 如果没有到达头,判断一下当前路径是否走过,路径走过的信息存储在
mark[]
中,如果没有走过,那么把当前深度的值设为+
,并标记已经走过,并走向更深一层。当深一层的递归完成后再将标记取消(回溯)。对于-
类型同理。
这样即可完成核心功能的实现,代码如下: