已经坚持了一段时间。我有以下两种方法:
public static int[] buildBoyerMooreCharTable(String pattern) {
int[] map = new int[Character.MAX_VALUE + 1];
char[] ca = pattern.toCharArray();
for (int i = 0; i < map.length; i++)
{
for (int k = 0; k < ca.length; k++)
{
if (Character.getNumericValue(ca[k]) == i)
{
//System.out.println("YO");
map[i] = findMax(1, pattern.length() - pattern.lastIndexOf(ca[k]) - 1);
}
}
}
for (int j =0 ; j < ca.length; j++)
{ System.out.println(map[Character.getNumericValue(ca[j])]);}
System.out.println("Gut check " + map[Character.getNumericValue('a')]);
return map;
}
方法2(仅显示相关代码)
public static List<Integer> boyerMoore(String pattern, String text) {
int i = pattern.length() - 1;
int j = pattern.length() - 1;
int k = 0;
boolean yo = false;
ArrayList<Integer> ans = new ArrayList<Integer>();
int[] last_table = buildBoyerMooreCharTable(pattern);
System.out.println("Did it transfer " + last_table[Character.getNumericValue('b')]);
...
我认为问题在于我的问题:
int[] last_table = buildBoyerMooreCharTable(pattern);
桌子没有正确转移!在我的显示窗口中,我得到以下内容:
Gut check 3
Gut check 0
Did it transfer 0
肠道检查3是正确的!所有其他的......不。
这被称为
StringSearch ss = new StringSearch();
String yay = "abcdabcdabce";
StringSearch.buildBoyerMooreCharTable(yay);
List<Integer> a_i = new ArrayList<Integer>();
a_i = StringSearch.boyerMoore("d", yay);
所以...当实际调用方法boyerMoore时...我们得到一个失败的值。
绕过我发布的所有代码 - 我认为可能有一个问题是不能理解如何设置彼此相等的数组......
答案 0 :(得分:1)
您正在调用Character.getNumericValue(char),但这似乎不是一个好选择。对于此函数的范围,返回值为-1到大于1000的值。 Character.getNumericValue('?')是-1。
我怀疑你想要使用值已经是值的ASCII值,所以你不需要调用任何函数来执行此操作。
if (Character.getNumericValue(ca[k]) == i)
应该只是
if (ca[k] == i)
搜索每个可能的角色是非常低效的,因为你知道只有每个出现的限制集。我建议你只搜索实际出现的角色。
为了您的兴趣,以下代码可以打印其他内容
for (int i = 0; i <= Character.MAX_VALUE; i++) {
int value = Character.getNumericValue(i);
if (value >= 0)
System.out.println((char) i + " is " + value);
}
罗马数字字符
ⅰ is 1
ⅱ is 2
ⅲ is 3
ⅳ is 4
ⅴ is 5
ⅵ is 6
ⅶ is 7
ⅷ is 8
ⅸ is 9
ⅹ is 10
ⅺ is 11
ⅻ is 12
ⅼ is 50
ⅽ is 100
ⅾ is 500
ⅿ is 1000