" 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;
}
}
答案 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