剑指Offer 28 字符串的排列

题目

输入一个字符串,打印出该字符串中字符的所有排列。

思路

  1. 首先求所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符交换;然后固定一个字符,求后面所有字符的排列;
  2. 可能出现在第一个位置的字符为stringBuilder.charAt(index),index为其中任意一个字符;在固定了在index位置的一个字符后,求后面所有字符的排列,递归调用permutation(stringBuilder,index+1)
  3. 终止条件:当最终递归调用到index+1=length时,输出此时的stringBuilder,且由于for循环的条件,故不在进行递归调用。
  4. 注意:
    在一个for循环内,i=1时将index为0和1的交换了,i=2时将index为0和2的交换了,为了使for循环内的调用相互不影响,在交换了字符之后应该还原。
    StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。
public class Q28Permutation {
    public static void permutation(String string){
        if (string==null||string.equals(""))
            return;
        StringBuilder stringBuilder=new StringBuilder(string);
        int index=0;
        permutation(stringBuilder,index);
    }
    public static void permutation(StringBuilder stringBuilder,int index){
        if (index==stringBuilder.length())
            System.out.println(stringBuilder);
        for (int i=index;i<stringBuilder.length();i++){
            char temp=stringBuilder.charAt(index);
            stringBuilder.setCharAt(index,stringBuilder.charAt(i));
            stringBuilder.setCharAt(i,temp);
            permutation(stringBuilder,index+1);
            stringBuilder.setCharAt(i,stringBuilder.charAt(index));
            stringBuilder.setCharAt(index,temp);
        }
    }

    public static void main(String[] args) {
        permutation("abcdef");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值