יול.19

Boggle Board

Boggle Board

נותנים מערך דו-מימדי של תווים (לוח) ורשימה של מילים שצריך למצוא בלוח. יש לכתוב אלגוריטם שמוצא את כל המילים.

  1. //O(nm*8^s + ws) time | O(nm + ws) space
  2. public static List<string> BoggleBoard(char[,] board, string[] words) {
  3. List<string> res = new List<string>();
  4. TrieNode root = new TrieNode('#');
  5. BuildTrieTree(root, words);
  6. for(int i = 0; i < board.GetLength(0); i++) {
  7. for(int j = 0; j < board.GetLength(1); j++) {
  8. if(root.Children[board[i, j]] != null)
  9. DFS(board, root, i, j, res);
  10. }
  11. }
  12. return res;
  13. }
  14. private static void DFS(char[,] board, TrieNode curr, int i, int j, List<string> res) {
  15. int[,] directions = new int[,] {{-1, 0}, {1, 0}, {0, 1}, {0, -1}, {-1, 1}, {1, 1}, {1, -1}, {-1, -1}};
  16. if(i < 0 || i >= board.GetLength(0) || j < 0 || j >= board.GetLength(1))
  17. return;
  18. char c = board[i, j];
  19. if(c == '#' || curr.Children[c] == null)
  20. return;
  21. curr = curr.Children[c];
  22. if(curr.word != "") {
  23. res.Add(curr.word);
  24. curr.word = "";
  25. }
  26. board[i, j] = '#';
  27. for(int d = 0; d < directions.GetLength(0); d++)
  28. DFS(board, curr, i + directions[d,0], j + directions[d,1], res);
  29. board[i, j] = c;
  30. }
  31. private static void BuildTrieTree(TrieNode root, string[] words) {
  32. foreach(string word in words) {
  33. TrieNode curr = root;
  34. foreach(char c in word) {
  35. if(curr.Children[c] == null)
  36. curr.Children[c] = new TrieNode(c);
  37. curr = curr.Children[c];
  38. }
  39. curr.word = word;
  40. }
  41. }
  42.  
  43. public class TrieNode {
  44. public char c;
  45. public string word;
  46. public TrieNode[] Children;
  47. public TrieNode(char c) {
  48. this.c = c;
  49. this.word = "";
  50. Children = new TrieNode[128];
  51. }
  52. }


תגיות:
שתף את הסיפור הזה:

תגובות(1)

  1. מריה
    לפני יותר משנה
    תיקון, כאן 
    O(nm) space

השאירו תגובה

קפטצ'ה לא מתאימה

תגובה