每日力扣-字母大小写全排列

119 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第29天,点击查看活动详情

每日力扣是一个专门用来讲力扣中国每天发布的每日一题的栏目。本专栏不提供题目的解答源码,只讲解思路,目的是养成每日刷题、提高自己手感,从而达到算法熟练的目标。

题目(已做删减处理)

给定一个字符串 s ,通过将字符串 s 中的每个字母转变大小写,我们可以获得一个新的字符串。返回 所有可能得到的字符串集合 。以 任意顺序 返回输出。

分析

从题目中要求的,返回最后可能得到的字符串集合。我们就可以暂定它是一道有关优先搜索的算法题目。这里我们使用回溯法来解答。

从左到右遍历字符串,假设当我们搜索字符串s的第i个字符为tmp时:

  • 如果 tmp 是一个数字,那么我们继续检测下一个字符;
  • 如果 tmp 是一个字符时,我们将它改变大小写撞他,继续搜索。当完成子状态的搜索后,对tmp进行恢复,然后继续搜索;
  • 如果完成当前字符串的搜索,则表示当前的子搜索已经完成,那么这个序列应该是全排列中的第一个。

因为每个字符的大小写形式差了32,我们可以使用异或运算来改变大小写状态。

总结

一道比较经典的搜索算法题目。首先是广度优先搜索,对于这样的题目,应该来说是特别容易的。然后就是回溯算法,也是同样比较简单。我在查询网上的解答方法时,也同样发现了使用二进制结构进行解答的,也同样比较精彩,这里就不做过多的赘述了。

解题证明

image.png