2016-10-18 22 views
0

私がしたいことは、与えられたシーケンス内のサブシーケンスを見つけることです。しかし、私はサブシーケンス法を違うものにしたい。すなわち、最初の桁は常に先頭に、2番目の桁は常に2番目になるようにします。したがって、それは注文を保存する必要があります。C#で注文保存サブシーケンスを見つける方法は?

たとえば、X = 100、Y = 350、Z = 35の場合、XとYの間のすべての数字を検索して、数字の桁にZ桁のシーケンス{ 5}。この場合の出力は8であるべきであり、部分配列は:235、305、315、325、335、345、350

public List<int> split(int Z) { 

    var digits = new List<int>(); 

    for (; Z > 0; Z /= 10) { 
     digits.Add(Z % 10); 
    } 

    return digits; 
} 

private static int count(int X, int Y, int Z) { 

    int count = 0; 
    var splitZ = split(Z); 

    for (int i = X; i <= Y; i++) { 
     var idigits = split(i); 
     var subseq = new LinkedList<int>(); 

     foreach (var digit in idigits) { 
      subseq.AddLast(digit); 

      if (subseq.Count == splitZ.Count) { 
       if (subseq.SequenceEqual(splitZ)) { 
        Console.WriteLine(i); 
        count++; 
       } 
      } 
     } 
    } 

    return count; 
} 

、135 Iは、上記のコードセグメントを有しているが、それに問題がすることですそれは8の代わりに出力3として返されます。ちょうどカウント、135、235、335。シーケンス35が互いに隣り合っているところです。任意のアイデアコードを変更し、私が欲しいものを達成する方法?

+0

基数ソートを見ましたか? –

+0

論理学期1 - DFAとNFAsを思い起こさせる – Benj

+0

@DavidLively本当はいいえ。 – typos

答えて

1

ロジックを少し変更しました。説明については、コード内のコメントを参照してください。

private static int count(int X, int Y, int Z) 
{ 

    int count = 0; 
    var splitZ = split(Z); 

    if (splitZ.Count == 0) 
    { 
     return Y - X + 1; // everything matches an empty Z sequence 
    } 

    for (int i = X; i <= Y; i++) 
    { 
     var idigits = split(i); 
     int subIndex = 0; 

     foreach (var digit in idigits) 
     { 
      if (splitZ[subIndex] == digit) 
      { 
       ++subIndex; // matched digit 
      } 

      if (subIndex >= splitZ.Count) 
      { 
       ++count; 
       break; // matched whole sub-sequence 
      } 
     } 
    } 

    return count; 
} 
+0

ありがとうございます。意味あり。 – typos

関連する問題