《劍指 offer》 學習27之字符串的排列

題目描述

輸入一個字符串,按字典序打印出該字符串中字符的所有排列。例如輸入字符串abc,則打印出由字符a,b,c所能排列出來的所有字符串abc,acb,bac,bca,cab和cba。

輸入描述:
輸入一個字符串,長度不超過9(可能有字符重複),字符只包括大小寫字母。
題目鏈接:牛客網

解題思路

import java.util.*;
public class Main {
    public static ArrayList<String> list = new ArrayList();
	public static void main(String[] args) {
		String s = "abc";
		
		printList(permutation(s));
	}
	
	public static ArrayList<String> permutation(String str) {
	    if (str.length() == 0) {
	        return list;
	    } 
	    
	    char[] ch = str.toCharArray();
	    Arrays.sort(ch);
	    backtracking(ch,new boolean[ch.length],new StringBuilder());
	    return list;
	}
	
	public static void backtracking(char[] chars,boolean[] hasUesd,StringBuilder sb) {
	    if (sb.length() == chars.length) {
	        list.add(sb.toString());
	        return;
	    } 
	    
	    for (int i = 0;i < chars.length;i++) {
	        if (hasUesd[i]) {
	            continue;
	        }
	        
	        if (i != 0 && chars[i] == chars[i - 1] && !hasUesd[i - 1]) {  // 保證不重複
	            continue;
	        }
	        
	        hasUesd[i] = true;
	        sb.append(chars[i]);
	        backtracking(chars,hasUesd,sb);
	        sb.deleteCharAt(sb.length() - 1);
	        hasUesd[i] = false;
	    } 
	}
	
	public static void printList(ArrayList list) {
	    for (int i = 0;i < list.size();i++) {
	        System.out.print(list.get(i) + " ");
	    } 
	}
	
}

測試結果

image.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章