给定一个字符串,输出该字符串中字符的所有排列。例如,输入字符串"abc",则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab、cba。

本文就跟大家分享下这个问题的解决方案,欢迎各位感兴趣的开发者阅读本文。

相信很多开发者看到这个问题都会脑子一片空白,找不到入手之处。那我们就尝试下把这个复杂的问题分解成小问题,比如,我们把一个字符串看成两部分组成:

第二部分是剩余的元素(除去当前元素)

如下图所示,我们从字符串的起始部位开始分析。

刚开始的时候,需要进行组合的字符是空字符,剩余的字符就是"abc"

紧接着,我们取出剩余字符的第0号位置的字符"a"作为当前需要进行组合的字符,剩余的字符就为"bc"

随后,我们再取出剩余字符的第0号位置的字符"b",上一步我们得到的需要组合的字符是"a",把上一步得到的字符与现在取出的字符进行拼接,我们就得到了"ab",剩余的字符为"c"

最后,我们取出剩余字符中最后一个字符"c",上一步我们得到的组合是"ab",将其拼接后,我们得到了"abc"。剩余字符为空,我们就得到了第一个组合 abc

我们在第二步的时候,剩余字符总共有两个字符"bc",上面我们只取出了第0个字符进行组合,我们还需要取出它的其他字符完成组合。

我们取出第1个字符"c",当前需要进行组合的字符是"a",拼接后,我们得到了"ac"

紧接着,我们取出剩余字符中的最后一个字符"b",当前需要进行组合的字符是"ac",拼接后,我们就得到了"acb"。剩余字符为空,我们就得到了第二个组合 acb

同样的,刚开始我们需要进行组合的字符为空,剩余的字符为"abc"

紧接着,我们取出剩余字符的第1号位置的字符"b"作为当前需要进行组合的字符,剩余的字符就为"ac"。

取出剩余字符的第0号元素"a",上一步我们得到的需要进行组合的字符为"b",将他们拼接后,得到了"ba",剩余的字符为"c"

继续去除最后一个剩余字符"b",上一步我们得到的需要进行组合的字符为"ba",拼接后,我们得到了"bac",剩余字符为空,我们就得到了第三个组合 bac

取出第1个字符"c",当前需要进行组合的字符是"b"。拼接后,我们得到了"bc",剩余的字符为"a"

取出最后一个剩余字符"a",当前需要进行组合的字符是"bc"。拼接后,我们得到了"bca",剩余字符为空,我们就得到了第四个组合 bca

遍历到剩余字符的末尾后,我们就得到了这个问题的解(找到了目标字符串的所有字符排列)

思路捋清楚之后,很容易就能将其转换为代码。

注意:字符串中如果有重复字符,会造成重复的排列组合。因此,我们在实现回溯函数的时候,用Set集合对当前遍历到的字符进行了标记,如果已经存在了就会跳过本轮循环,继续找下一个字符。

我们用文章开头所列举的例子来校验下上述代码能否正确给出结果。