この記事は公式アカウント[DevelopingPigeon]から公開されています!フォローへようこそ!!!
古いルール-姉妹都市都市:
1。トピック
(1)質問の語幹
文字列を入力し、文字列内の文字のすべての順列を出力します。
この文字列配列は任意の順序で返すことができますが、重複する要素を含めることはできません。
(2)例
输入:s = "abc"
输出:["abc","acb","bac","bca","cab","cba"]
二。回答
(1)アイデア
文字列のすべての順列を見つける方法は?単純な「abc」を使用してシミュレートし、最初にaを最初の文字とし、2番目の文字としてbまたはcを選択します。3番目の文字は自動的に決定されます。次に、bを最初の文字として最初の文字に戻ります。 1文字、2番目の文字にaまたはcを選択します。同じ理由で、最初の文字としてcを使用します。このようにして、文字列のすべての順列が列挙されます。
この単純なシミュレーションでは、dfsのアイデアを使用して再帰的に解決するように促すことができます。最終的な文字列の配置には繰り返し文字を含めることができないため、各レイヤーの各文字を1回使用できます。これは、セットセットの使用に関連しています。繰り返される文字を除外します。各レイヤーにセットセットを設定し、例として「abc」を使用します。最初のレイヤーは3回ループされ、3つの最初のレイヤーの文字変換に使用されます。2番目のレイヤーは2回交換され、最後のレイヤーは自動的に決定されます。交換はスワップを使用します()関数は文字配列内の位置を交換します。次のレイヤーのこのレイヤーに再帰的にバックトラックした後、スワップ関数を使用して2つの位置を交換します。
(2)コード
Java:
class Solution {
public List<String> list = new ArrayList<>();
char[] c;
public String[] permutation(String s) {
// 不能重复
// 字符串的所有排列?
c = s.toCharArray();
dfs(0);
return list.toArray(new String[list.size()]);
}
public void dfs(int x){
if(x == c.length - 1){
list.add(String.valueOf(c));
return;
}
// 每一级的set防止重复
Set<Character> set = new HashSet<>();
for(int i = x; i < c.length; ++i){
if(set.contains(c[i])){
continue;
}
set.add(c[i]);
swap(i, x);
dfs(x+1);
// 换回来,恢复原样,回溯到上级中
swap(x, i);
}
}
public void swap(int i , int x){
char temp = c[i];
c[i] = c[x];
c[x] = temp;
}
}