簡體   English   中英

如何在C#中查找保留順序的子序列?

[英]How to find order-preserving subsequence in C#?

我想做的是找到給定序列中的子序列。 但我希望子序列方法有所不同。 即,第一位數字應始終排在第一位,第二位總是第二位,依此類推。 因此,應該保留訂單。

例如給定三個整數,X = 100,Y = 350,Z = 35,我想查找X和Y之間的所有數字,以使數字數字包含Z數字的序列,即{3,5}。 在這種情況下,輸出應為8,子序列為:135、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;
}

我有上面的代碼段,但是它的問題是,它作為輸出3而不是8返回。它只計數135、235、335。其中序列35彼此相鄰。 有任何想法如何修改代碼並實現我想要的嗎?

改變了您的邏輯。 請參閱代碼中的注釋以獲取解釋。

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM