代码之家  ›  专栏  ›  技术社区  ›  dreadwail

有效确定数组中哪些字符串是其他字符串的子字符串?

  •  2
  • dreadwail  · 技术社区  · 14 年前

    在C中,假设您有一个字符串数组,其中只包含字符“0”和“1”:

    string[] input = { "0101", "101", "11", "010101011" };
    

    您希望构建一个函数:

    public void IdentifySubstrings(string[] input) { ... }
    

    这将产生以下结果:

    "0101 is a substring of 010101011"
    "101 is a substring of 0101"
    "101 is a substring of 010101011"
    "11 is a substring of 010101011"
    

    而你是 不是 能够使用内置的字符串功能(如string.substring)。

    如何有效地解决这个问题?当然,你可以通过蛮力来完成它,但它只是觉得应该有一种方法来用一棵树来完成它(因为唯一的值是0和1,所以它感觉就像一棵二叉树应该以某种方式匹配)。我读过一些关于后缀树的东西,但是我不确定这是否是正确的路径。

    你能想到什么有效的解决方案吗?

    2 回复  |  直到 14 年前
        1
  •  2
  •   FastAl    14 年前

    首先,除了至少搜索一次字符串中的每个字节(或位;-)之外,您没有其他选择。最好将它们保留为字节。然后执行 Trie (或变体)。将所有子字符串加载到trie中。节点对象应该包含标识它们属于哪个已加载数组元素的成员。然后用每个子字符串搜索它并进行匹配。

        2
  •  0
  •   Charles Bretana    14 年前

    还没有测试过这个,但它很接近吗?

    var string2FindLen = string2Find.Length;
    var ndx = 0;
    var x = string2Find[ndx];
    foreach(var c in string2LookIn)
    {
        if (ndx == string2FindLen) return true;
        if (c==x) x = string2Find[++ndx];
        else ndx = 0;
    }
    return false;