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,但这是不可能的,因为我事先不知道模式(匹配的字符的长度是可变的)
后来我想搜索整个字符串b
中a
那么如果没有更迭,删除字符串一个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=AAT
和b=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)
不确定我是否理解这个问题。我会猜测如下:取 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
以返回索引。