《劍指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=[]#空列表的
輸入一個字符串,按字典序打印出該字符串中字符的所有排列。例如輸入字符串abc,則打印出由字符a,b,c所能排列出來的所有字符串abc,acb,bac,bca,cab和cba。
system rem back ont span temp str cte public package myprac.LeetCode; import java.util.ArrayList; import java.util.List; public
《劍指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