查找字符串是否符合某种模式

时间:2013-01-25 13:43:35

标签: java string

我最近接受了Google对软件工程职位的采访,并且问到了构建模式匹配器的问题。

所以你必须建立

boolean isPattern(String givenPattern, String stringToMatch)

执行以下操作的功能:

givenPattern是一个包含以下内容的字符串:

a) 'a'-'z' chars
b) '*' chars which can be matched by 0 or more letters
c) '?' which just matches to a character - any letter basically

所以这个电话可能就像

isPattern("abc", "abcd") - 返回false,因为它与模式不匹配('d'是额外的)

isPattern("a*bc", "aksakwjahwhajahbcdbc"),这是真的,因为我们在开始时有一个'a',之后有很多字符,然后以“bc”结尾

isPattern("a?bc", "adbc")返回true,因为模式的每个字符在给定字符串中匹配。

在采访中,时间很短,我认为可以走过模式,看看角色是一个字母,一个*或一个?然后分别匹配给定字符串中的字符。但最终成为一组复杂的for循环,我们无法在给定的45分钟内得出结论。

有人可以告诉我他们如何快速有效地解决这个问题吗?

非常感谢!

2 个答案:

答案 0 :(得分:6)

假设您被允许使用正则表达式,您可以编写如下内容:

static boolean isPattern(String givenPattern, String stringToMatch) {
    String regex = "^" + givenPattern.replace("*", ".*").replace("?", ".") + "$";

    return Pattern.compile(regex).matcher(stringToMatch).matches();
}

"^"是字符串
的开头 "$"是字符串
的结尾 .代表“任何角色”,恰好是一次 .*用于“任何字符”,0次或更多次

注意:如果您只想将*?限制为字母,可以使用[a-zA-Z]代替.

答案 1 :(得分:3)

boolean isPattern(String givenPattern, String stringToMatch) {
    if (givenPattern.empty)
        return stringToMatch.isEmpty();
    char patternCh = givenPatter.charAt(0);
    boolean atEnd = stringToMatch.isEmpty();
    if (patternCh == '*') {
        return isPattenn(givenPattern.substring(1), stringToMatch)
            || (!atEnd && isPattern(givenPattern, stringToMatch.substring(1)));
    } else if (patternCh == '?') {
        return !atEnd && isPattern(givenPattern.substring(1), 
            stringToMatch.substring(1));
    }
    return !atEnd && patternCh == stringToMatch.charAt(0)
          && isPattern(givenPattern.substring(1), stringToNatch.subtring(1);
}

(递归最容易理解。)