2016-04-27 16 views
1

入力されたナンバープレート(例:ABC123)と置換値のリスト(例えば、1Iで置き換えられます)に従います。私はすべての可能性の組み合わせを得る必要があります。複数文字置換による文字列の組み合わせ

1 => I 
3 => B 
A => H 
0 (zero) => O 
O => 0 (zero) 

入力:

ABC123

期待出力:

ABC123、 ABCI23、例えば

ABCI28、 ABC128、 HBC123、 HBCI23、 HBCI28、 HBC128

私はString Combinations With Character Replacementてみましたが、私はできません...

+5

あなたが試したものを投稿してください。それがうまくいくかどうかは関係ありませんt。 – Xiaoy312

答えて

2

あなたは再帰を使用してそれを行うことができ、それぞれの反復

public static IEnumerable<string> Combinations(string s, Dictionary<char, char> replacements) 
{ 
    return Combinations(s, replacements, 0, string.Empty); 
} 

private static IEnumerable<string> Combinations(string original, Dictionary<char, char> replacements, int index, string current) 
{ 
    if (index == original.Length) yield return current; 
    else 
    { 
     foreach (var item in Combinations(original, replacements, index + 1, current + original[index])) 
      yield return item; 

     if (replacements.ContainsKey(original[index])) 
      foreach (var item in Combinations(original, replacements, index + 1, current + replacements[original[index]])) 
       yield return item; 
    } 
} 

そしてそうのように、このメソッドを呼び出します:、このような何かを、元の文字と交換を使用して再帰的に文字と呼んで210

Dictionary<char, char> dict = new Dictionary<char,char>(); 
dict['1'] = 'I'; 
dict['3'] = 'B'; 
dict['A'] = 'H'; 
dict['O'] = '0'; 
dict['0'] = 'O'; 

var combs = Combinations("ABC123", dict); 
+0

偉大な答え@ArturoMenchaca - 私はこれを使用していますが、 "1"のすべての組み合わせを "I"と "L"に調整したい場合、これはどのようにして達成されますか?私はあなたのコードをの辞書に調整しようとしましたが、それが可能かどうか疑問に思ったので、2つのバリエーションでコードをコピーして貼り付けてから、 。ちょうどそれが*どのようにすべきか疑問に思った。 –

+0

@DevologyLtd:あなたが言ったようにchar []を使うことができますし、 'if(replacements.ContainsKey ...')文で再帰呼び出しの前に 'foreach(varを置き換え[original [index]]) 'current + replaceacements [original [index]]'を 'current + replace'に置き換えることができます。 –

0

それは簡単Looking at each combination in jagged arrayに私の答えからアルゴリズムを利用することによって行うことができます。

public static class Algorithms 
{ 
    public static IEnumerable<string> GetCombinations(this char[][] input) 
    { 
     var result = new char[input.Length]; 
     var indices = new int[input.Length]; 
     for (int pos = 0, index = 0; ;) 
     { 
      for (; pos < input.Length; pos++, index = 0) 
      { 
       indices[pos] = index; 
       result[pos] = input[pos][index]; 
      } 
      yield return new string(result); 
      do 
      { 
       if (pos == 0) yield break; 
       index = indices[--pos] + 1; 
      } 
      while (index >= input[pos].Length); 
     } 
    } 
} 

次のメソッドを追加することによって:

public static IEnumerable<string> GetCombinations(this string input, Dictionary<char, char> replacements) 
{ 
    return input.Select(c => 
    { 
     char r; 
     return replacements.TryGetValue(c, out r) && c != r ? new[] { c, r } : new[] { c }; 
    }).ToArray().GetCombinations(); 
} 

使用例:

var replacements = new Dictionary<char, char> { { '1', 'I' }, { '3', '8' }, { 'A', 'H' }, { '0', 'O' }, { 'O', '0' } }; 
var test = "ABC123".GetCombinations(replacements); 
foreach (var comb in test) Console.WriteLine(comb); 
関連する問題