字符串匹配:匹配带或不带空格的单词

时间:2013-06-14 14:27:16

标签: string algorithm

我希望找到一种方法,我可以在以下两个例子中将“b m w”映射到“bmw”和“ali baba”到“alibaba”。

  1. “b m w shops”和“bmw”
  2. 我需要确定是否可以将“b m w”写为“bmw”

    我想到了这种方法:

    从原始字符串中删除空格。这给了“bmwshops”。现在找到“bmwshop”和“bmw”中最大的公共子串。

    第二个例子:

    1. “阿里巴巴和40个盗贼”和“阿里巴巴和40个盗贼”
    2. 上述方法在这种情况下不起作用。

      是否有可以使用的标准算法?

2 个答案:

答案 0 :(得分:0)

这听起来像你在问这个问题:"如何通过删除(某些)空格来确定字符串A是否可以与字符串B相等?"。

你可以做的是迭代两个字符串,只要它们具有相同的字符就在两个字符串中前进,否则当它有空格时沿第一个字符串前进,否则返回false。像这样:

static bool IsEqualToAfterRemovingSpacesFromOne(this string a, string b) {
    return a.IsEqualToAfterRemovingSpacesFromFirst(b)
        || b.IsEqualToAfterRemovingSpacesFromFirst(a);
}
static bool IsEqualToAfterRemovingSpacesFromFirst(this string a, string b) {
    var i = 0;
    var j = 0;
    while (i < a.Length && j < b.Length) {
        if (a[i] == b[j]) {
            i += 1
            j += 1
        } else if (a[i] == ' ') {
            i += 1;
        } else {
            return false;
        }
    }
    return i == a.Length && j == b.Length;
}

以上只是一个稍微修改过的字符串比较。如果你想将它扩展到最大的公共子串&#39;,那么采用最大的公共子串算法并做同样的事情:每当你因第一个字符串中的空格而失败时,只需跳过去它

答案 1 :(得分:0)

您是否看过Suffix Array - http://en.wikipedia.org/wiki/Suffix_array 或者来自Jon Bentley - Programming Pearl

注意:您必须编写代码来处理空格。