diff --git a/algorithm/For-offer/25.md b/algorithm/For-offer/25.md index 0b8500a4..95b41202 100644 --- a/algorithm/For-offer/25.md +++ b/algorithm/For-offer/25.md @@ -10,6 +10,8 @@ 这其实是很典型的递归思路。 +考虑字符串中含有重复字符的情况,第一个字符和后面所要交换的字符重复时,无需交换。 + ## 三、解题代码 ```java @@ -40,16 +42,21 @@ public class Test { if (chars.length - 1 == begin) { System.out.print(new String(chars) + " "); } else { - char tmp; +            // 首位不变时,进行排列 +            permutation(chars, begin + 1); +            char tmp; // 对当前还未处理的字符串进行处理,每个字符都可以作为当前处理位置的元素 - for (int i = begin; i < chars.length; i++) { - // 下面是交换元素的位置 - tmp = chars[begin]; - chars[begin] = chars[i]; - chars[i] = tmp; - - // 处理下一个位置 - permutation(chars, begin + 1); +            for (int i = begin + 1; i < chars.length; i++) { +             if(chars[begin] != chars[i]){ + // 下面是交换元素的位置 + tmp = chars[begin]; + chars[begin] = chars[i]; + chars[i] = tmp; + + // 处理下一个位置 + permutation(chars, begin + 1); + } +               } } }