1. 程式人生 > >《劍指offer》-按字典序列打印出字串中字元的所有排列

《劍指offer》-按字典序列打印出字串中字元的所有排列

/*
 * 輸入一個字串,按字典序打印出該字串中字元的所有排列。
 * 例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。
 * 思路:
 * 分治法:將第一個位置的元素與其他所有位置進行交換,
 * 之後針對得到的每一個字串,將第二個位置的元素與其他所有位置進行交換
 * ....
 */
import java.util.*;
public class Permutation {
	public ArrayList<String> permutation(String str) {
		ArrayList<String> list = new ArrayList<String>();  
		if(str == null || str.length() == 0) return list;	
		list.add(str);
		getList(0, str, list);
		Collections.sort(list);		//按字母順序進行排序
		return list;
    }
	
	public static void getList(int start, String str, ArrayList<String> list) {
		if(start >= str.length() - 1) return;
		
		String strBackup = str;		//備份str,以備還原現場用
		StringBuffer sb = new StringBuffer(strBackup);	//可變		
		for(int i = start;i < str.length() - 1;i ++) {
			for(int j = i + 1;j < str.length();j ++) {
				char c = sb.charAt(i);
				sb.setCharAt(i, sb.charAt(j));
				sb.setCharAt(j, c);
				//去重
				if(!list.contains(sb.toString())) {
					list.add(sb.toString());
				}
				getList(start + 1, sb.toString(), list);
				sb = new StringBuffer(strBackup);	//還原現場
			}
		}
		
		return;
	}
	
	//非遞迴方法:這個方法比原來的方法邏輯清晰
	ArrayList<String> strList = new ArrayList<String>();
	public ArrayList<String> permutation2(String str) {
		if(str.length() == 0)
			return strList;	 
		strList.add(str);
		 
		for(int index = 0;index < str.length() - 1;index ++) {	//總共迴圈的次數
			int size = strList.size();
			for(int i = 0;i < size;i ++) {	 //注:這個地方不能寫成i < strList.size(),因為一次迴圈過後strList的size變大了
				String strTemp = strList.get(i);
				addStr(strTemp, index);
			} 
		}
		 
		Collections.sort(strList);	
		return strList;
	}
	 
	//將下標不為index的字元和下標是index的字元交換
	public void addStr(String str, int index) {	 
		for(int i = index + 1;i < str.length();i ++) {
			StringBuffer sb = new StringBuffer(str);
			char c = sb.charAt(index);
			sb.setCharAt(index, sb.charAt(i));
			sb.setCharAt(i, c);
			
			if(!strList.contains(sb.toString())) {
				strList.add(sb.toString());
			}
		}
	}
	
	public static void main(String[] args) {
		ArrayList<String> list = new Permutation().permutation2("abc");
		for(String strTemp : list) {
			System.out.print(strTemp + " ");
		}
	}
}

相關推薦

offer》-字典序列字串字元所有排列

/* * 輸入一個字串,按字典序打印出該字串中字元的所有排列。 * 例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。 * 思路: * 分治法:將第一個位置的元素與其他所有位置進行交換, * 之後針對得

輸入一個字串,字典字串字元所有排列offer

題目 輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。 簡單解釋下什麼是字典序,簡單理解就是像英文字典那樣排序, 設想一本英語字典裡的單詞,何者在前何者在後? 顯然的

《牛客網offer27題》輸入一個字串,字典字串字元所有排列

題目 : 輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。 結果 : 牛客網編譯通過 程式碼及思路:     //中心思想:列出第一位所有可能情況,然後後

offer--從尾到頭鏈表

util sub nod next pub node 節點 arr mov 題目描述 輸入一個鏈表,從尾到頭打印鏈表每個節點的值。 1、利用棧,先入後出 import java.util.*; class ListNode{ int val; ListNode n

offer 20 順時針矩陣

e30 順時針 dry target mpi smc 劍指offer off tar 84頗m嘶柑40趙潞謁4ahttp://tushu.docin.com/chtcw264 1F94i壬第06業http://tushu.docin.com/cgofj8543 84p8

[offer] 從尾到頭鏈表

itl push_back scribe pub rom listnode -i str tail 題目描述 輸入一個鏈表,從尾到頭打印鏈表每個節點的值。 沒什麽難度,看清從尾到頭即可... /** * struct ListNode { * i

Offer —— BFS 寬度優先

bottom color 打印 node views 描述 Coding .net nbsp https://www.nowcoder.net/practice/7fe2212963db4790b57431d9ed259701?tpId=13&tqId=11175&

offer】17、從1到最大的n位數

++ lse style ret char bsp 大數問題 要求 dig 題目 輸入數字n,按順序打印從1到最大n位的十進制數。比如輸入3,打印1到999。 思路 輸入的數字可以很大,可以是33,65,這樣的話int和long long都不能滿足題目要求,所以這是一個大數

offer——字典順序輸出字串排列

很多演算法題對於Python來說,感覺都可以用封裝解決。其實若按照c++一步一步來進行,有時候也失去了Python便利的意義。(反正我沒在答案裡找到。) 基本思路都是用先把可能的排列找出來,在sorted。 class Solution: def Permutation(self,ss

offer--26.順時針矩陣

item muti ids des print pty for describe esc 1,2,3,45,6,7,88,10,11,1213,14,15,16 每次輸出第一行,然後刪除第一行,逆時針旋轉剩下的矩陣。 ------------------------

基於回溯法思想:輸入一個字串,字典字串字元所有排列。例如輸入字串abc,則字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。

    連結:https://www.nowcoder.com/questionTerminal/fe6b651b66ae47d7acce78ffdd9a96c7 來源:牛客網 import java.util.List; import java.util.Col

#題目描述:輸入一個字串,字典字串字元所有排列。例如輸入字串abc, #則字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba

才學不久,希望每天能記錄一篇 import random def zidianxulie():#封裝整個函式 a=input(“請輸入字串:”) a1=sorted(a)#先對我輸入的字串進行一個排序,簡單得到一個列表 l=[]#空列表的

Offer》面試題:找陣列有3個出現一次的數字

題目 一個int陣列中有三個數字a、b、c只出現一次,其他數字都出現了兩次。請找出三個只出現一次的數字。 思路 由於3個數字出現一次,其他數字均出現兩次,因此可以得到n一定為奇數。 3個只出現一次的數字,他們的bit位肯定不可能全部相同,也就是說

Offer》:刪除在另一個字串出現的字元

題目 題目:輸入兩個字串,從第一字串中刪除第二個字串中所有的字元。 例如,輸入”They are students.”和”aeiou”,則刪除之後的第一個字串變成”Thy r stdnt

59、offer--之字形順序二叉樹

print 題目 一個棧 wrap offer 二叉 原因 treenode 只有一個 題目描述 請實現一個函數按照之字形打印二叉樹,即第一行按照從左到右的順序打印,第二層按照從右至左的順序打印,第三行按照從左到右的順序打印,其他行以此類推。 解題思路:通過分析,使用棧

Offer——之字形順序二叉樹

打印二叉樹 sta cnblogs 我們 pre 方便 pri == stack 題目描述: 請實現一個函數按照之字形打印二叉樹,即第一行按照從左到右的順序打印,第二層按照從右至左的順序打印,第三行按照從左到右的順序打印,其他行以此類推。 分析: 我們都知道二叉樹的層次遍歷

offer——之字形順序列印二叉樹

問題描述: 請實現一個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。 思路: 之字形列印其實與上一個按層

offer編程-二維數組的查找

ret 程序 思路 mes targe 插入 itl 規律 else if 二維數組中的查找 題目描述 在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。

offer五十六之刪除鏈表重復的結點

string opened get spl size java nod ger 劍指offer 一、題目   在一個排序的鏈表中,存在重復的結點,請刪除該鏈表中重復的結點,重復的結點不保留,返回鏈表頭指針。 例如,鏈表1->2->3->3->4-&g