使用“*”作为通配符的Java递归字符串比较

时间:2013-04-03 06:10:02

标签: java algorithm recursion compare

我正在编写一个递归方法,检查字符串的每个字母以进行比较。我无法将“*”字符与任何字符匹配,并根据需要充当许多字母。 (把它作为通配符)

我想知道是否有人可以给我一个关于将要使用的算法的提示?

这是我到目前为止所拥有的。

public static boolean match(String x, String y) {
    return match_loop(x, y, 0, 1);
}

public static boolean match_loop(String a, String b, int i, int s) {
    try {
        if (a == b) {
            return true;
        }

        if (i >= a.length() && i >= b.length()) {
            return true;
        }

        if (a.charAt(i) == b.charAt(i)) {
            return match_loop(a, b, i + 1, s);
        }


        //(((...A bunch of if statements for my other recursion requirements

        return false;

    } catch (java.lang.StringIndexOutOfBoundsException e) {
        return false;
    }
}

public static void main(String[] args) {
    System.out.println(match("test", "t*t")); // should return true
}

我正在考虑做的是为方法添加另一个争论,一个将作为反向信件的int。基本上我在想这个 如果char(i-s)中的a或b(s最初为1.)是*,则用s + 1重新调用递归。 然后是一些不同的ifs语句来修复bug。然而,这种方法似乎很长且重复。我还可以使用其他算法吗?

4 个答案:

答案 0 :(得分:2)

请勿使用==进行String值比较。使用equals()方法。

if (a == b)应为if a.equals(b)

答案 1 :(得分:0)

看看this algorithm。它返回与模式匹配的所有子串,因此您必须检查整个字符串是否最终匹配,但这应该很容易。

它以O(km)时间运行,其中k是通配符的数量,m是输入字符串的长度。

答案 2 :(得分:0)

如果您只使用一个字符(" *")作为通配符,我建议您使用正则表达式。如;

public static boolean match(String x, String y) {
    String regex= y.replace("*", "(.*)");
    if(x.matches(regex)) {
        return true;
    }
}


public static void main(String[] args) {
    System.out.println(match("test", "t*t")); // should return true
}

我认为以这种方式阅读代码会更容易。

答案 3 :(得分:-1)

本书将告诉您具体操作方法: http://www.amazon.com/Compilers-Principles-Techniques-Alfred-Aho/dp/0201100886

这是一个简单的Java实现,可以帮助您实现正确的目标:http://matt.might.net/articles/implementation-of-nfas-and-regular-expressions-in-java/

基本上,工业强度实施是状态机。您解构正则表达式 - 其中包含'*'的字符串 - 并为其创建图形。然后递归搜索图形,例如在广度优先树搜索中。

以下是对不同方法的讨论,这有助于说明方法:http://swtch.com/~rsc/regexp/regexp1.html