搜索字符串而不管空格

时间:2012-11-20 04:00:35

标签: algorithm

我有一个包含"a""b""ab""ab c""ab cd"的短语的ArrayList。 输入可能是"ab c""ab    c"。在任何一种情况下,它都应该与ArrayList中的"ab c"匹配。我需要一个算法。

3 个答案:

答案 0 :(得分:1)

您真正要问的是如何用一个空格替换多个空格。这可能是您所需要的:See this question.

答案 1 :(得分:0)

我不知道你使用的语言是什么,但最简单的伪代码是:

f(string inString, ArrayList<string> list):
    string s = inString.removeAllWhitespace();
    foreach (string s2 in list):
        string lString = s2.removeAllWhitespace();
        if (s.equals(lString))
            return true

    return false

如果您希望它更快,请尝试以下方法:

f(string inString, ArrayList<string> list):
    foreach (string s in list):
        i1 = 0
        i2 = 0
        while (i1 < inString.length && i2 < s.length):
            if (iswhitespace(inString[i1])):
                i1++
            else if (iswhitespace(s[i2])):
                i2++
            else if (inString[i1] == s[i2]):
                i1++
                i2++
            else:
                continue foreach

        # account for trailing whitespace in both strings
        while (i1 < inString.length):
            if (!iswhitespace(inString[i1])):
                break
            i1++
        while (i2 < s.length):
            if (!iswhitespace(s[i2])):
                break
            i2++

        # strings are equal if we reached the end of both without
        # finding different characters (ignoring whitespace)
        if (i1 == inString.length && i2 == s2.length):
            return true
    return false

这将遍历具有唯一索引的每个字符串,在找到空格或匹配时递增。如果字符不匹配,则拒绝该字符串并继续外部循环。

此伪代码未经测试,但应该让您了解如何执行此操作。我建议去删除空白路径。它的代码更简单,速度也不会太慢,并且为读者提供了非常明显的线索,说明你要做什么。

在大多数语言中,字符串是不可变的,因此执行此替换不会影响ArrayList中的字符串。

答案 2 :(得分:0)

bool hacked_compare(const string& s, const string& t){
    string::const_iterator si = s.begin(), ti = t.begin();
    while (si != s.end() && ti != t.end() && (isspace(*si) || isspace(*ti))){
        // ignore all spaces leading to next char.
        while (si != s.end() && isspace(*si))
            si++;
        while (ti != t.end() && isspace(*ti))
            ti++;
        // check for equality of two chars.
        if (*si != *ti)
            return false;
        // keep going through both strings.
        si++;
        ti++;
    }
    //if we got this far then the strings were "equivalent" or empty.
    return true;
}