Nadesłany przez Tomasz Lubiński, 23 marca 2007 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
BM.java:
// Algorytm Boyer-Moore
// Tomasz Lubinski (c) 2007
// www.algorytm.org
public class BM {
private final static int ASIZE = 255;
private static int bad_character_shift[] = new int[ASIZE];
private static int good_suffix_shift[];
private static int suff[];
//prepare bad character shift table
private static void pre_bad_character_shift(String pattern)
{
int m = pattern.length();
for (int i = 0; i < ASIZE; i++)
{
bad_character_shift[i] = m;
}
for (int i = 0; i < m - 1; ++i)
{
bad_character_shift[pattern.charAt(i)] = m - i - 1;
}
}
//prepare suff table
private static void pre_suff(String pattern)
{
int j;
int m = pattern.length();
suff = new int[m];
suff[m - 1] = m;
for (int i = m - 2; i >= 0; --i) {
for (j = 0; j <= i && pattern.charAt(i-j) == pattern.charAt(m-j-1); j++);
suff[i] = j;
}
}
//prepare good_suffix_shift table
private static void pre_good_suffix_shift(String pattern)
{
int j = 0;
int m = pattern.length();
good_suffix_shift = new int[m];
pre_suff(pattern);
for (int i = 0; i < m; i++)
{
good_suffix_shift[i] = m;
}
j = 0;
for (int i = m - 1; i >= 0; --i)
{
if (suff[i] == i + 1)
{
for (; j < m - 1 - i; ++j)
{
good_suffix_shift[j] = m - 1 - i;
}
}
}
for (int i = 0; i <= m - 2; ++i)
{
good_suffix_shift[m - 1 - suff[i]] = m - 1 - i;
}
}
//Boyer-Moore algorithm
private static void BM_alg(String text, String pattern)
{
int i, j;
int m = pattern.length();
int n = text.length();
pre_bad_character_shift(pattern);
pre_good_suffix_shift(pattern);
j = 0;
while (j <= n - m) {
for (i = m - 1; i >= 0 && pattern.charAt(i) == text.charAt(i + j); --i);
if (i < 0) {
System.out.print(j + " ");
j += good_suffix_shift[0];
}
else
j += Math.max(good_suffix_shift[i], bad_character_shift[text.charAt(i + j)] - m + 1 + i);
}
}
//Get data
public static void main(String[] args) {
String pattern;
String text;
System.out.println("Podaj tekst");
text = Console.readString();
System.out.println("Podaj wzorzec");
pattern = Console.readString();
BM_alg(text, pattern);
}
}

