题目
输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串 abc、acb、bac、bca、cab和cba。(可能有字符重复,字符只包括大小写字母)
分析
把一个字符串看成由两部分组成:第一部分为它的第一个字符,第二部分是后面的所有字符。
我们求整个字符串的排列,可以看成两步:首先求所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符交换。首先固定第一个字符,求后面所有字符的排列。这个时候我们仍把后面的所有字符分成两部分:后面字符的第一个字符,以及这个字符之后的所有字符。然后把第一个字符逐一和它后面的字符交换。
注意:
- 由于可能有字符重复,所以交换时需要做判断,一样的字符不做交换,一定程度上起到了去重减少递归的效果,但是不能达到绝对的去重,因此还是使用
TreeSet
进行存储结果实现去重。- 同时在每次递归调用之后需要将前一次的交换操作还原。
实现
|
|