データ構造とアルゴリズムの文字列配置
文字列の配置とは、文字列内のすべての文字を特定の順序で配置して新しい文字列を取得することを指します。たとえば、文字列「abc」は、「abc」、「acb」、「bac」、「bca」、「cab」、および「cba」の 6 つの方法で配置できます。
文字列配置の原理は再帰によって実現できます。入力文字列が s であると仮定すると、最初の文字と後続の文字の位置を交換して、新しい文字列 s’ を取得します。次に、s’ の最初の文字を残りの文字と交換して、新しい文字列 s’' を取得します。最後の文字が交換されるまで同様に続きます。
文字列の配置を実装する場合は、次の点に注意する必要があります。
-
文字が繰り返し含まれる文字列の場合は、順列の繰り返しを避けるために重複を除去する必要があります。
-
再帰的に実装する場合、各交換後に次の交換のために元の文字列を復元する必要があります。
-
再帰を実装する場合、フラグ ビットを設定して現在の文字が交換されたかどうかを記録し、繰り返しの交換を避けることができます。
以下は、Java コードを使用した文字列の置換の例です。
public ArrayList<String> permutation(String s) {
ArrayList<String> res = new ArrayList<>();
if (s == null || s.length() == 0) {
return res;
}
char[] chars = s.toCharArray();
permutation(chars, 0, res);
return res;
}
private void permutation(char[] chars, int i, ArrayList<String> res) {
if (i == chars.length - 1) {
res.add(new String(chars));
return;
}
for (int j = i; j < chars.length; j++) {
if (j == i || chars[j] != chars[i]) {
swap(chars, i, j);
permutation(chars, i + 1, res);
swap(chars, i, j);
}
}
}
private void swap(char[] chars, int i, int j) {
char temp = chars[i];
chars[i] = chars[j];
chars[j] = temp;
}
1. 文字列配置のC実装と詳細コード解説
文字列の配置とは、文字列内の文字を配置および組み合わせて、可能な限りの配置を出力することを指します。たとえば、文字列「abc」には、「abc」、「acb」、「bac」、「bca」、「cab」、「cba」という順列があります。
以下は、C 言語での文字列配置のコードと詳細な説明です。
#include <stdio.h>
#include <string.h>
void swap(char *a, char *b) {
char temp = *a;
*a = *b;
*b = temp;
}
void permute(char *str, int l, int r) {
if (l == r) {
printf("%s\n", str);
} else {
for (int i = l; i <= r; i++) {
swap(str + l, str + i);
permute(str, l + 1, r);
swap(str + l, str + i);
}
}
}
int main() {
char str[] = "abc";
int n = strlen(str);
permute(str, 0, n - 1);
return 0;
}
このプログラムは、再帰的方法を使用して文字列の置換を実装します。
-
swap()
2 つの文字の値を交換するために使用される関数。 -
permute()
関数は、元の文字列str
、文字列の開始位置l
、文字列の終了位置の 3 つのパラメータを受け取ります。r
。 -
l
がr
と等しい場合、文字列内のすべての文字を一度配置して文字列を出力したことを意味します。 -
如果
l
不等于r
,则将str[l]
和str[i]
交换,其中i
从l
开始,直到r
。 -
は
permute()
関数を再帰的に呼び出し、l
を 1 ずつ増やしてr
を変更しません。 -
次の順列では、
str[l]
とstr[i]
を再度入れ替えます。 -
main() 関数では、まず文字列
str
を定義し、次に文字列n
の長さを計算します。 -
最後に
permute()
関数を呼び出し、str
、開始位置0
、終了位置n-1
この時点で、プログラムは「abc」、「acb」、「bac」、「bca」、「cab」、および「cba」を出力します。これらはすべて「abc」の順列であるためです。
2. 文字列配置のC++実装と詳細コード解説
文字列の順列は、指定された文字列内の文字を配置し、すべての順列の可能性を出力します。例えば、文字列「abc」の配列は、「abc」、「acb」、「bac」、「bca」、「cab」、「cba」などになります。
C++言語を使用して文字列の配置を実装する方法は次のとおりです。
- 文字列の最初の文字から始めて、各文字をその後の文字と交換します。
- 交換される文字列ごとに、次の文字を再帰的に交換します。
- 最後の文字まで再帰する場合は、現在の文字列を出力します。
具体的な実装コードは以下のとおりです。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
void permutation(string str, int begin, vector<string>& result) {
if (begin == str.size() - 1) {
result.push_back(str);
return;
}
for (int i = begin; i < str.size(); ++i) {
swap(str[begin], str[i]);
permutation(str, begin + 1, result);
swap(str[begin], str[i]);
}
}
int main() {
string str = "abc";
vector<string> result;
permutation(str, 0, result);
for (auto s : result) {
cout << s << endl;
}
return 0;
}
まず、文字列の配置を実装するpermutation
関数を定義します。この関数は、文字列str
、交換される現在の文字位置begin
、配置結果を保持するベクトルの 3 つのパラメータを入力として受け取ります。 4>。 result
関数の主な実装は次のとおりです。
- 交換する現在の文字位置
begin
が文字列の末尾に達すると、配置が完了し、文字列がに追加されます。 2>そして戻ります。result
- 現在の文字列について、
begin
位置から開始して次の文字を交換し、begin
文字列の終わりまで再帰的に次の文字を交換します。が達成された。
関数main
では、まず配置する文字列str
と配置結果を保存するベクトルを定義します 関数を呼び出して結果を整理して出力します。 result
permutation
3. 文字列配置のJava実装と詳細コード解説
文字列の配置とは、文字列内のすべての文字を異なる配置で組み合わせて、異なる文字列シーケンスを取得することを指します。文字列の並べ替えは、バックトラッキングまたは再帰を使用して実装できます。以下は、再帰を使用して文字列を配置する Java コードです。
import java.util.*;
public class StringPermutation {
public static ArrayList<String> permutation(String str) {
ArrayList<String> result = new ArrayList<>();
if (str == null || str.length() == 0) {
return result;
}
char[] arr = str.toCharArray();
permutationHelper(arr, 0, result);
Collections.sort(result); // 对结果集进行排序
return result;
}
private static void permutationHelper(char[] arr, int index, ArrayList<String> result) {
if (index == arr.length - 1) {
result.add(new String(arr));
} else {
Set<Character> charSet = new HashSet<>(); // 用set保存当前已经排列过的字符,避免重复排列
for (int i = index; i < arr.length; i++) {
if (!charSet.contains(arr[i])) {
charSet.add(arr[i]);
swap(arr, index, i);
permutationHelper(arr, index + 1, result);
swap(arr, index, i);
}
}
}
}
private static void swap(char[] arr, int i, int j) {
if (i != j) {
char temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
コードの詳細な説明:
permutation()
このメソッドはメイン メソッドであり、文字列を受け取り、配列された文字列のシーケンスを返します。- まず文字列を判定し、文字列がnullまたは長さが0の場合は空の結果セットを返します。
- 文字列を文字配列に変換し、
permutationHelper()
メソッドを呼び出して再帰的に配置します。 permutationHelper()
このメソッドは文字配列、インデックス、および結果セットを受け取ります。これは、インデックスから開始して文字配列を並べて得られた結果を結果セットに追加することを示します。- インデックスが文字配列の最後の位置に到達した場合、配列が取得されたことを意味し、その配列が結果セットに追加されます。
- それ以外の場合は、現在のインデックスから開始して、文字配列内の要素が現在のインデックス位置と順番に交換され、すべての順列が得られるまで残りの文字配列が再帰的に配置されます。
- set を使用して、現在配置されている文字を保存し、配置の繰り返しを避けます。
- 最後に、ソートされた結果セットを返します。