在LINQ中查找字符串A中字符串B的子字符串C的最有效方法

cMi*_*nor 8 c# algorithm string-matching

有2个字符串,如:

string a = "ATTAGACCTGCCGGAA";
string b = "GCCGGAATAC";
Run Code Online (Sandbox Code Playgroud)

我想删除两个字符串中常见的部分,然后将其连接起来.我必须告诉我需要删除的只留下匹配的部分所以我会得到

输入

 ATTAGACCTGCCGGAA
          GCCGGAATAC
Run Code Online (Sandbox Code Playgroud)

产量

ATTAGACCTGCCGGAATAC
Run Code Online (Sandbox Code Playgroud)

首先我想使用一个模式,然后使用seacrh,但这是不可能的,因为我事先不知道模式(匹配的字符的长度是可变的)

后来我想搜索整个字符串ba那么如果没有更迭,删除字符串一个char a(最后一个,因为我想保留最左边无与伦比的字符串),然后循环播放,直到我有没有更多的字符b

string a = "ATTAGACCTGCCGGAA";
string b = "GCCGGAATAC";
int times = b.Length;
string wantedString = string.Empty;
string auxString = b;
while (times > 0)
{

    if (!a.Contains(auxString))
    {
        //save last char and then delete it from auxString
        wantedString += auxString[auxString.Length - 1];
        auxString = auxString.TrimEnd(auxString[auxString.Length - 1]);
    }
    else
        break;
    times--;
}
//reverse string 
char[] reversedToAppend = wantedString.ToCharArray();
Array.Reverse(reversedToAppend);
string toAppend = new string(reversedToAppend);
Run Code Online (Sandbox Code Playgroud)

所以答案就是这样做a + toAppend ;
有没有办法让这个更有效率?(也许在LINQ?)

编辑

正如@lavin指出的那样,c可以在任何地方发生a,同时作为b的前缀.例如if a=AATb=AAG,代码应该返回AATG.原因是因为从左边开始的常见字符串是c=AA.我们删除了这个b ,然后我们得到a=AAT了结果G

AAT
AAG
Run Code Online (Sandbox Code Playgroud)

造成

AATG
Run Code Online (Sandbox Code Playgroud)

其他例子是:

a=ATTTGGGCCGCGCGCGAAAACCCCGCG
b=                  AACCCCGCGCGCA
Run Code Online (Sandbox Code Playgroud)

这里

c= AACCCCGCG
Run Code Online (Sandbox Code Playgroud)

所以结果应该是

result = ATTTGGGCCGCGCGCGAAAACCCCGCGCGCA
Run Code Online (Sandbox Code Playgroud)

top*_*l32 0

不确定我是否理解这个问题。我会猜测如下:取 2 个字符串,A并且B,如果C存在对应关系,则D = A + (B - C)

class Program
{
    static void Main(string[] args)
    {
        Test test = new Test();

        string a = "ATTAGACCTGCCGGAA";
        string b = "GCCGGAATAC";

        string match = test.Match(a, b); // GCCGGAA

        if (match != null)
        {
            string c = a + b.Remove(b.IndexOf(match), match.Length); // ATTAGACCTGCCGGAATAC

            Console.WriteLine(c);
        }
    }
}

class Test
{
    public string Match(string a, string b)
    {
        if (a == null)
        {
            throw new ArgumentNullException("a");
        }

        if (b == null)
        {
            throw new ArgumentNullException("b");
        }

        string best = null;

        for (int i = 0; i < b.Length; i++)
        {
            string match = Match(a, b, i);

            if (match != null && (best == null || match.Length > best.Length))
            {
                best = match;
            }
        }

        return best;
    }

    private string Match(string a, string b, int offset)
    {
        string best = null;

        for (int i = offset; i < b.Length; i++)
        {
            string s = b.Substring(offset, (i - offset) + 1);
            int index = a.IndexOf(s);

            if (index != -1)
            {
                best = s;
            }
        }

        return best;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您想要更优化的版本,请修改Test以返回索引。