C#でリストのすべてのサブリスト(部分列)を出力する方法
C#では、ネストしたループと List<T> を組み合わせることで、文字列やリストからすべてのサブリスト(部分列)を効率的に生成できます。この記事では、文字列「xyz」を例に、その実装方法を段階的に解説します。
ステップ1:リストを作成する
まず、サブリストを格納するためのリストを作成します。
List<string> list = new List<string>();
ステップ2:ループでサブリストを生成する
ここでは、文字列「xyz」のすべてのサブリストを求めます。外側のループで文字を1つずつ処理しながら、内側のループで既存の各要素に新しい文字を連結した組み合わせを別のリストに生成し、それを元のリストへ追加していきます。
for (int i = 1; i < str.Length; i++) {
list.Add(str[i - 1].ToString());
List<string> newlist = new List<string>();
for (int j = 0; j < list.Count; j++) {
string list2 = list[j] + str[i];
newlist.Add(list2);
}
list.AddRange(newlist);
}
処理の流れ
- 外側のループ: 文字列の2文字目以降を順番に処理します。
- 内側のループ: 現在のリストの各要素に新しい文字を連結し、新しいサブリストを作成します。
- AddRange(): 新しく生成したサブリストを元のリストに一括で追加します。
- 仕上げ: ループ終了後に最後の文字単体をリストへ加え、
Sort()で整列してから出力します。
完全なコード例
using System;
using System.Collections.Generic;
namespace Demo {
class MyApplication {
static void Main(string[] args) {
string str = "xyz";
List<string> list = new List<string>();
for (int i = 1; i < str.Length; i++) {
list.Add(str[i - 1].ToString());
List<string> newlist = new List<string>();
for (int j = 0; j < list.Count; j++) {
string list2 = list[j] + str[i];
newlist.Add(list2);
}
list.AddRange(newlist);
}
list.Add(str[str.Length - 1].ToString());
list.Sort();
Console.WriteLine(string.Join(Environment.NewLine, list));
}
}
}
実行結果
x xy xyz xz y yz z
補足:生成されるサブリストの数
長さ n の文字列からは、空でない部分列が 2n − 1 個生成されます。今回の「xyz」(n = 3)の場合は 23 − 1 = 7 個となり、実行結果の7行と一致します。なお、このアルゴリズムは元の文字の並び順を保った部分列を生成するため、文字の順序を入れ替える順列とは異なる点に注意してください。
-
指定した範囲内のすべての素数を出力するPythonプログラム
この記事では、以下の問題文に対する解決方法について学んでいきます。 問題文 ある区間が与えられたとき、その範囲内に含まれるすべての素数を求めて出力する必要があります。 ここでは、素数の基本的な定義に基づいた全探索(ブルートフォース)によるアプローチを紹介します。素数とは、「1とその数自身のみを約数として持ち、それ以外の数を約数に持たない自然数」のことです。 この定義に基づき、各数値が素数の条件を満たしているかどうかを判定し、条件が真(True)と評価されるたびに出力処理を行います。 それでは、実際の実装例を見ていきましょう。 実装例 start = 1 end = 37 for val in
-
指定された文字列のすべての順列を出力するPythonプログラム
本記事では、以下の問題に対する解決策について詳しく学んでいきます。 問題文 1つの文字列が与えられたとき、その文字列から作成できるすべての順列(並べ替えの組み合わせ)を表示する必要があります。 それでは、以下の実装例で具体的な解決策を見ていきましょう。 実装例 # リストを文字列に変換 def toString(List): return .join(List) # 順列の生成 def permute(a, l, r): if l == r: print(toString(a)) else: for i in range(l, r +