剑指offer-例题 字符串的排列

题目描述

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

import java.util.ArrayList;
import java.util.Arrays;
import java.lang.Character;
public class Solution {
    private ArrayList<String> result=new ArrayList<String>();
    public ArrayList<String> Permutation(String str) {
        if(str==null)
           return result;
        if(str.length()==0)
           return result;
        char[] ch=str.toCharArray();
        Arrays.sort(ch);
        StringBuilder s=new StringBuilder();
        boolean[] flag=new boolean[ch.length];
        sort(ch,s,flag);
        return result;
    }
    private void sort(char[] ch, StringBuilder s, boolean[] flag){
        if(s.length()==ch.length)
        {
            result.add(s.toString());
            return;
        }
        //s上一位的所有可能情况
        for(int i=0;i<ch.length;i++)
        {
            if(flag[i]==true)
                continue;
            if(i!=0&&ch[i]==ch[i-1]&&flag[i-1]==false)//重复字符必须在先前重复字符都被使用了的情况下才能使用  这也是前面要先对ch排序的原因
                continue;
            s.append(ch[i]);
            flag[i]=true;
            sort(ch,s,flag);//进行s的下一位
            s.deleteCharAt(s.length()-1);
            flag[i]=false;
        }
    }
}

String——>char[]

记录结果——>StringBuilder

在s的每一位上遍历所有可能性,一共有ch.length种情况,而不是在ch的每一位上遍历

先对ch进行排序,这样可以使重复的字符相邻

只有当前面的重复字符使用后才能使用后续重复字符,以避免重复,因为两个字符是相同的而第一个字符还未被使用的话,当前的所有情况也是后续使用第一个字符的所有情况,会发生重复

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值