字串的全排列
阿新 • • 發佈:2018-12-10
題目描述 輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串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;
}
}