【剑指offer】字符串的排列

一、题目描述

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

注意:
1、题目要求按照字典序打出排列(如果使用的数据结构不具有自动排序的功能,则需要考虑排序问题)
2、输入的字符可能有重复字符(不考虑的话通过率20%)

二、思路分析及代码实现

我们把字符串放入字符数组中,然后从第一位开始依次用后面的字符替换,然后考虑后面的全排列,在这里没有考虑重复的问题,因此我们最后交换得到的字符串一定存在重复,我们在添加到list之前才考虑重复问题。
最后需要考虑字典序列。使用 Collections.sort(list);实现。

import java.util.*;
public class Solution {
    ArrayList<String> list=new ArrayList<>();
    public ArrayList<String> Permutation(String str) {
      if(str.length()==0) return list;
      char array[]= str.toCharArray();
      getFullpermutation(array,0,array.length);
      //对list中的元素排序
      Collections.sort(list);
      return list;
    }
  public void getFullpermutation(char[] array,int start, int end){
    if(end<0)
      return;
    if(start==end){
      ArrtoStr(array);
    }else{
      for(int i=start;i<end;i++){
        swap(array,i,start);
        getFullpermutation(array,start+1,end);
        swap(array,start,i);
      }
    }
  }
  public void swap(char[] array, int i, int j){
    char ch=array[i];
    array[i]=array[j];
    array[j]=ch;
  }
  public void ArrtoStr(char[] array){
    String str="";
    for(int i=0;i<array.length;i++)
      str=str+Character.toString(array[i]);
    if(!list.contains(str))
      list.add(str);
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值