import java.util.*; public class TheStates { // Let's first create a list of all states. private static final String[] STATES = { "Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado", "Connecticut", "Delaware", "Florida", "Georgia", "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts", "Michigan", "Minnesota", "Mississippi", "Missouri", "Montana", "Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico", "New York", "North Carolina", "North Dakota", "Ohio", "Oklahoma", "Oregon", "Pennsylvania", "Rhode Island", "South Carolina", "South Dakota", "Tennessee", "Texas", "Utah", "Vermont", "Virginia", "Washington", "West Virginia", "Wisconsin", "Wyoming" }; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int choice; while (true) { System.out.println(""); System.out.println("Menu:"); System.out.println("1 - Display the text"); System.out.println("2 - Search"); System.out.println("3 - Exit program"); System.out.print("Enter your choice: "); choice = scanner.nextInt(); scanner.nextLine(); // consume newline switch (choice) { case 1: System.out.println("\nText containing all states:\n"); System.out.println(STATESLIST); break; case 2: System.out.print("\nEnter a pattern to search: "); String pattern = scanner.nextLine(); List results = boyerBadCharSearch(STATESLIST, pattern); if (results.isEmpty()) { System.out.println("Pattern not found."); } else { System.out.println("Pattern found at indices: " + results); } break; case 3: System.out.println("Exiting program."); scanner.close(); return; default: System.out.println("Invalid option. Try again."); } } } // Create a single string containing all state names separated by a dash private static final String STATESLIST = String.join(" - ", STATES); // Boyer-Moyer bad character search public static List boyerBadCharSearch(String text, String pattern) { List result = new ArrayList<>(); int[] badChar = buildBadCharTable(pattern); int m = pattern.length(); int n = text.length(); int shift = 0; while (shift <= (n - m)) { int j = m - 1; // Move from right to left of the pattern while (j >= 0 && pattern.charAt(j) == text.charAt(shift + j)) j--; if (j < 0) { result.add(shift); if (shift + m < text.length()) { shift += m - badChar[text.charAt(shift + m)]; } else { shift += 1; } } else { shift += Math.max(1, j - badChar[text.charAt(shift + j)]); } } return result; } // Build bad character table public static int[] buildBadCharTable(String pattern) { final int SIZE = 256; int[] table = new int[SIZE]; Arrays.fill(table, -1); for (int i = 0; i < pattern.length(); i++) { table[pattern.charAt(i)] = i; } return table; } }