1. 程式人生 > >劍指Offer題目:字符串的排列

劍指Offer題目:字符串的排列

wap toc java res add font 16px turn return

題目描述:

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

題目分析:

最簡單的是使用字典序生成法,這樣可以把有重復字符串的情況也考慮進去。

Java實現代碼:

import java.util.ArrayList;
import java.util.Arrays;
public class Solution {
    
    private ArrayList<String> res = new ArrayList<String>();
    
    
public ArrayList<String> Permutation(String str) { int len = str.length(); if(len == 0) return res; if(len == 1) {res.add(str); return res; } char [] seq = str.toCharArray(); Arrays.sort(seq); res.add(String.valueOf(seq));
while(true){ int k = len-1; while(k>=1 && seq[k-1]>=seq[k]){ k--; } if(k == 0) break; k--; int l = k + 1; while(l<len && seq[l] > seq[k]){ l++; } l
--; swap(seq, k,l); reverse(seq, k+1); res.add(String.valueOf(seq)); } return res; } public void reverse(char[] seq, int start){ int len = seq.length; if(len == 0) return; for(int i=0; i< (len-start)>>1; ++i){ int p = start + i; int q = len - i-1; if(p == q) return; swap(seq, p, q); } } public void swap(char[] seq, int a, int b){ char temp = seq[a]; seq[a] = seq[b]; seq[b] = temp; } }

劍指Offer題目:字符串的排列