0

被困了一段时间。我有以下两种方法:

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 时......我们得到了一个失败的值。

绕过我发布的所有代码 - 我认为可能存在不了解如何将数组设置为彼此相等的问题......

4

1 回答 1

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
于 2013-11-01T20:28:00.820 回答