From 675cb37701323d59f6c3988618e4cd1d7345eaa2 Mon Sep 17 00:00:00 2001 From: Daniel Feng W Date: Wed, 28 Mar 2018 14:49:32 +0800 Subject: [PATCH] Update 25.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 考虑字符串中含有重复字符的情况,第一个字符和后面所要交换的字符重复时,无需交换。 --- algorithm/For-offer/25.md | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) 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); + } +               } } }