5

単語の大文字と小文字のすべての可能な順列を含むリストを作成したいと考えています。そうなるだろう

List<string> permutate(string word)
{
    List<string> ret = new List<string>();
    MAGIC HAPPENS HERE
    return ret;
}

だから私が入れたと言って、"happy"私は配列を取り戻すべきです

{happy, Happy, hAppy, HAppy, haPpy, HaPpy ... haPPY, HaPPY, hAPPY, HAPPY}

最初の文字を大文字にする関数をたくさん知っていますが、単語の任意の文字をどのように処理すればよいですか?

4

8 に答える 8

11

文字列を char の配列に変換すると、個々の文字を変更できます。このような何かがうまくいくはずです...

public static List<string> Permute( string s )
{
  List<string> listPermutations = new List<string>();

  char[] array = s.ToLower().ToCharArray();
  int iterations = (1 << array.Length) - 1;

  for( int i = 0; i <= iterations; i++ )
  {
    for( int j = 0; j < array.Length; j++ )
    array[j] = (i & (1<<j)) != 0 
                  ? char.ToUpper( array[j] ) 
                  : char.ToLower( array[j] );
    listPermutations.Add( new string( array ) );
  }
  return listPermutations;
}
于 2009-05-25T04:54:00.363 に答える
1

順序が重要でない場合は、 Linqを試すことができます。の範囲内のすべての 2 進数を列挙します[0..2**word.Length]各数値をマスクとして扱います: 0- 小文字、1- 大文字。たとえばhappy

mask      string
----------------
00000  ->  happy
00001      Happy
00010      hAppy
00011      HAppy
00100      haPpy
00101      HaPpy
...
11111      HAPPY

コード:

  using System.Linq;

  ... 

  List<string> permutate(string word) =>
    Enumerable
      .Range(0, 1 << word.Length)
      .Select(mask => string.Concat(word.Select((c, i) => (mask & (1 << i)) == 0 
         ? char.ToLower(c) 
         : char.ToUpper(c))))
      .ToList();

デモ:

  Console.Write(string.Join(", ", permutate("happy")));

結果:

happy, Happy, hAppy, HAppy, haPpy, HaPpy, hAPpy, HAPpy, hapPy, HapPy, hApPy, HApPy, haPPy, HaPPy, hAPPy, HAPPy, happY, HappY, hAppY, HAppY, haPpY, HaPpY, hAPpY, HAPpY, hapPY, HapPY, hApPY, HApPY, haPPY, HaPPY, hAPPY, HAPPY 
于 2019-06-21T08:27:49.657 に答える
1

受け入れられた回答は、任意の文字を大文字にする最も簡単な方法ですが、同じ文字セットで大文字を繰り返し変更する場合 (たとえば、「幸せ」で 32 回、長い単語では指数関数的に成長する場合) に注意してください。の場合、文字列を char[] に変換し、適切な文字を設定し、配列から文字列を構築する方が効率的です。

于 2009-05-25T04:50:10.163 に答える