剑指Offer题目:字符串的排列
题目描述:
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串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; } }
技进乎艺,艺进乎道