Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.BufferedReader;
- import java.io.InputStreamReader;
- import java.net.URL;
- import java.util.*;
- import java.util.stream.Collectors;
- public class WordReducer
- {
- private static final String WORDS_URL = "https://raw.githubusercontent.com/nikiiv/JavaCodingTestOne/master/scrabble-words.txt";
- private static final Set<String> VALID_ONE_LETTER_WORDS = Set.of("I", "A");
- private Set<String> dictionary;
- public static void main(String[] args) throws Exception
- {
- WordReducer reducer = new WordReducer();
- reducer.populateDictionary();
- System.out.println("Dictionary loaded with " + reducer.dictionary.size() + " words.\n");
- List<String> allNineLetterWords = reducer.dictionary.stream()
- .filter(w -> w.length() == 9)
- .toList();
- for (String word : allNineLetterWords)
- {
- List<String> chain = reducer.findSubWordChainBFS(word);
- if (chain != null)
- {
- System.out.println("Chain found: " + chain);
- }
- }
- }
- public void populateDictionary() throws Exception
- {
- URL url = new URL(WORDS_URL);
- try (BufferedReader br = new BufferedReader(new InputStreamReader(url.openConnection().getInputStream())))
- {
- dictionary = br.lines()
- .skip(1)
- .map(String::trim)
- .filter(line -> !line.isEmpty())
- .map(String::toUpperCase)
- .filter(word -> word.length() != 1 || VALID_ONE_LETTER_WORDS.contains(word))
- .collect(Collectors.toSet());
- }
- dictionary.add("I");
- dictionary.add("A");
- }
- public List<String> AllSubWordsFromWord(String word)
- {
- List<String> subWords = new ArrayList<>();
- for (int i = 0; i < word.length(); i++)
- {
- String sub = word.substring(0, i) + word.substring(i + 1);
- subWords.add(sub);
- }
- subWords.removeIf(String::isEmpty);
- return subWords.stream().distinct().collect(Collectors.toList());
- }
- public List<String> findSubWordChainBFS(String startWord)
- {
- if (!dictionary.contains(startWord))
- {
- return null;
- }
- Queue<List<String>> queue = new LinkedList<>();
- queue.add(List.of(startWord));
- Set<String> visited = new HashSet<>();
- visited.add(startWord);
- while (!queue.isEmpty())
- {
- List<String> currentChain = queue.poll();
- String currentWord = currentChain.get(currentChain.size() - 1);
- if (currentWord.length() == 1 && VALID_ONE_LETTER_WORDS.contains(currentWord))
- {
- return currentChain;
- }
- List<String> validSubWords = AllSubWordsFromWord(currentWord).stream()
- .map(String::toUpperCase)
- .filter(dictionary::contains)
- .filter(word -> !visited.contains(word))
- .toList();
- for (String subWord : validSubWords)
- {
- List<String> newChain = new ArrayList<>(currentChain);
- newChain.add(subWord);
- queue.add(newChain);
- visited.add(subWord);
- }
- }
- return null;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement