字符串解析并查找公共空白位置

时间:2012-07-05 03:36:50

标签: c# algorithm

我正在尝试解析字符串并找到一个常见的空白位置。

这是我的字符串

abc   xyz 123   456
cba 1234a 45623 say
avc  4567 bv    456

可以有任意数量的字符串。我需要一个通用的算法,最好在c#中找到上面字符串中的常见空格位置。

例如,在上面的字符串中,常见位置是

4, 10 ,16 

每个字符串都有空格。

我一直在尝试的方法包括Intersect,并获取所有可能的空格,然后进行比较以找出常见的空格,但我试图找出最佳解决方案。

2 个答案:

答案 0 :(得分:2)

var stringList = new[] { "abc   xyz 123   456", "cba 1234a 45623 say", "avc  4567 bv    456" };
var shortest = stringList.OrderBy(s => s.Length).First();
var result = new Collection<int>();

for (int i = 0; i < shortest.Length; i++)
{
    if (stringList.All(c => c[i] == ' ')) result.Add(i+1);
}

// Test the results
foreach (var index in result)
{
    Console.WriteLine(index);
}

答案 1 :(得分:2)

在第一个字符串中创建一组空白位置。检查第二个sting中的那些位置,如果第二个字符串中该位置的字符不是空格,则从集合中移除位置。重复其余的字符串。

另一种可能性是找到每个字符串中空白的位置集,然后找到这些集合的交集。这将具有一个潜在的优势。虽然这通常会做更多的工作,但部分工作(找到各个组)很容易并行执行。我怀疑这会经常赢得(除非,你可能有很多字符串和很多内核)。虽然它可能不那么明显,你也可以找到并行的集合交叉点 - 你基本上做了交叉的二叉树,所以在第一次迭代中你找到了对之间的交叉点,在第二次迭代中你发现了成对的结果之间的交叉点从第一次迭代开始,依此类推,直到你只剩下一组。假设至少有许多核心作为字符串,这将时间复杂度从O(N)减少到O(log N)。