1. 程式人生 > >字串的全排列

字串的全排列

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

這裡寫圖片描述

基本的思路是:一個字串的排列等於第一字元和後面剩餘字串排列的組合,對於含有N字元的字串,組合中第一個字串有N種可能,那麼將所有的字串輪流放在組合第一個當第一個字元,其餘的N-1的字串再計算其排列。因為這就是一個遞迴的過程。

C++程式碼

class Solution {
public:
    vector<string> Permutation(string str) 
    {
        vector
<string>
vec_str; if(str.empty()) return vec_str; Permutation1(str, 0, vec_str); sort(vec_str.begin(),vec_str.end()); //注意最後還要排序 return vec_str; } /* 函式功能:對一個字串計算其排列 函式引數: string str -- 待排列的字串 int begin -- 當前原始字串中當組合第一個字元的下標 vector<string>& vecStr -- 儲存字串的組合 */
void Permutation1(string str, int begin, vector<string>& vecStr) { if(begin==(str.size()-1)) //遍歷到了字串結尾 { vecStr.push_back(str); return; } //這裡的i從begin開始,相當於當前Permutation1函式只處理從begin之後的字串 for(int i=begin;i<str.size();i++) { if
(str[i]==str[begin]&&i!=begin) //去重 continue; swap(str[i],str[begin]); //交換兩個字元的位置 Permutation1(str, begin+1, vecStr); swap(str[i],str[begin]); //當前位置處理後,交換回字元的位置 } } };

Java程式碼

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

public class Solution {
    public static void main(String[] args) {
        Solution p = new Solution();
        System.out.println(p.Permutation("abc").toString());
    }

    public ArrayList<String> Permutation(String str) {
        List<String> res = new ArrayList<>();
        if (str != null && str.length() > 0) {
            PermutationHelper(str.toCharArray(), 0, res);
            Collections.sort(res);
        }
        return (ArrayList)res;
    }

    public void PermutationHelper(char[] cs, int i, List<String> list) {
        if (i == cs.length - 1) {
            String val = String.valueOf(cs);
            if (!list.contains(val))
                list.add(val);
        } else {
            for (int j = i; j < cs.length; j++) {
                swap(cs, i, j);
                PermutationHelper(cs, i+1, list);
                swap(cs, i, j);
            }
        }
    }

    public void swap(char[] cs, int i, int j) {
        char temp = cs[i];
        cs[i] = cs[j];
        cs[j] = temp;
    }
}