我希望找到一种方法,我可以在以下两个例子中将“b m w”映射到“bmw”和“ali baba”到“alibaba”。
我需要确定是否可以将“b m w”写为“bmw”
我想到了这种方法:
从原始字符串中删除空格。这给了“bmwshops”。现在找到“bmwshop”和“bmw”中最大的公共子串。
第二个例子:
上述方法在这种情况下不起作用。
是否有可以使用的标准算法?
答案 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
注意:您必须编写代码来处理空格。