字母数字串的所有组合,更好的方法?

时间:2015-08-07 20:35:05

标签: java string recursion

" alphaNumeric"的输入function是一个字符串,由全部小写的字母数字字符组成,例如" hello123hello"。我希望能够通过check()函数检查此字符串的所有大写/小写字母组合。 (例如,HeLlO123hELlo是要检查的组合之一)。我用Java编写代码来执行此操作,将匹配的String存储到ArrayList中,但是想知道是否有更好的方法可以在没有ArrayList的情况下执行此操作。另外,我说的最坏情况运行时是O(2 ^ n)吗?注意:Check是一个返回true或false的函数,具体取决于是否将正确的String传递给函数。

public static String alphaNumeric(String input) {
    ArrayList<String> list = new ArrayList<String>();
    alphaHelper(input, "", list);
    return list.get(0);
}

private static void alphaHelper(String in, String current, ArrayList<String> list) {
    if (in.length() == 0) {
        if (check(current)) {
            list.add(current);
        }
    } else if (Character.isLetter(in.charAt(0))) {
        alphaHelper(in.substring(1),current+in.substring(0,1).toLowerCase(),list);
        alphaHelper(in.substring(1),current+in.substring(0,1).toUpperCase(),list);
    } else if (Character.isDigit(in.charAt(0))) {
        alphaHelper(in.substring(1),current+in.substring(0,1),list);
    } else {
        return;
    }
}

2 个答案:

答案 0 :(得分:1)

如果您只想在不更改基本算法的情况下删除ArrayList,则可以执行以下操作:

public static String alphaNumeric(String input) {
    return alphaHelper(input, "");
}

private static String alphaHelper(String in, String current) {
    String result = null;

    if (check(current)) {
        result = current;
    } else if (Character.isLetter(in.charAt(0))) {
        result = alphaHelper(in.substring(1),current+in.substring(0,1).toLowerCase());
        if (result == null) result = alphaHelper(in.substring(1),current+in.substring(0,1).toUpperCase());
    } else if (Character.isDigit(in.charAt(0))) {
        result = alphaHelper(in.substring(1),current+in.substring(0,1));
    }

    return result;
}

是的,它是O(2 ^ n),如果你不能直接获得原始字符串,我无法看到你如何改进。

如果您不需要检查子字符串(即您只关心整个字符串的大小写变化),您可以通过不测试子字符串来改进算法,但它仍然是O(2 ^ n)。

答案 1 :(得分:0)

您可以暂时将检查和输入都设置为小写,然后比较它们。

    public static boolean alphaNumeric(String input, String check) {
        return input.toLowerCase().equals(check.toLowerCase());
    }

-Sean