GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing github.com — Java/DynamicProgramming/RegexMatching.java at master · AmaranthLIS/Java Expand file tree/ Copy pathRegexMatching.javaMore file actions 171 lines (154 loc) · 4.75 KB / Copy pathRegexMatching.javaFile metadata and controls171 lines (154 loc) · 4.75 KB 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 package DynamicProgramming; /** * Given a text and wildcard pattern implement a wildcard pattern matching * algorithm that finds if wildcard is matched with text. The matching should * cover the entire text * ?-> matches single characters * *-> match the sequence of characters **/ /** * For calculation of Time and Space Complexity. Let N be length of src and M be length of pat **/ public class RegexMatching { // Method 1: Using Recursion // Time Complexity=0(2^(N+M)) Space Complexity=Recursion Extra Space static boolean regexRecursion(String src, String pat) { if (src.length() == 0 && pat.length() == 0) { return true; } if (src.length() != 0 && pat.length() == 0) { return false; } if (src.length() == 0 && pat.length() != 0) { for (int i = 0; i < pat.length(); i++) { if (pat.charAt(i) != '*') { return false; } } return true; } char chs = src.charAt(0); char chp = pat.charAt(0); String ros = src.substring(1); String rop = pat.substring(1); boolean ans; if (chs == chp || chp == '?') { ans = regexRecursion(ros, rop); } else if (chp == '*') { boolean blank = regexRecursion(src, rop); boolean multiple = regexRecursion(ros, pat); ans = blank || multiple; } else { ans = false; } return ans; } // Method 2: Using Recursion and breaking string using virtual index // Time Complexity=0(2^(N+M)) Space Complexity=Recursion Extra Space static boolean regexRecursion(String src, String pat, int svidx, int pvidx) { if (src.length() == svidx && pat.length() == pvidx) { return true; } if (src.length() != svidx && pat.length() == pvidx) { return false; } if (src.length() == svidx && pat.length() != pvidx) { for (int i = pvidx; i < pat.length(); i++) { if (pat.charAt(i) != '*') { return false; } } return true; } char chs = src.charAt(svidx); char chp = pat.charAt(pvidx); boolean ans; if (chs == chp || chp == '?') { ans = regexRecursion(src, pat, svidx + 1, pvidx + 1); } else if (chp == '*') { boolean blank = regexRecursion(src, pat, svidx, pvidx + 1); boolean multiple = regexRecursion(src, pat, svidx + 1, pvidx); ans = blank || multiple; } else { ans = false; } return ans; } // Method 3: Top-Down DP(Memoization) // Time Complexity=0(N*M) Space Complexity=0(N*M)+Recursion Extra Space static boolean regexRecursion(String src, String pat, int svidx, int pvidx, int[][] strg) { if (src.length() == svidx && pat.length() == pvidx) { return true; } if (src.length() != svidx && pat.length() == pvidx) { return false; } if (src.length() == svidx && pat.length() != pvidx) { for (int i = pvidx; i < pat.length(); i++) { if (pat.charAt(i) != '*') { return false; } } return true; } if (strg[svidx][pvidx] != 0) { return strg[svidx][pvidx] == 1 ? false : true; } char chs = src.charAt(svidx); char chp = pat.charAt(pvidx); boolean ans; if (chs == chp || chp == '?') { ans = regexRecursion(src, pat, svidx + 1, pvidx + 1, strg); } else if (chp == '*') { boolean blank = regexRecursion(src, pat, svidx, pvidx + 1, strg); boolean multiple = regexRecursion(src, pat, svidx + 1, pvidx, strg); ans = blank || multiple; } else { ans = false; } strg[svidx][pvidx] = ans == false ? 1 : 2; return ans; } // Method 4: Bottom-Up DP(Tabulation) // Time Complexity=0(N*M) Space Complexity=0(N*M) static boolean regexBU(String src, String pat) { boolean strg[][] = new boolean[src.length() + 1][pat.length() + 1]; strg[src.length()][pat.length()] = true; for (int row = src.length(); row >= 0; row--) { for (int col = pat.length() - 1; col >= 0; col--) { if (row == src.length()) { if (pat.charAt(col) == '*') { strg[row][col] = strg[row][col + 1]; } else { strg[row][col] = false; } } else { char chs = src.charAt(row); char chp = pat.charAt(col); boolean ans; if (chs == chp || chp == '?') { ans = strg[row + 1][col + 1]; } else if (chp == '*') { boolean blank = strg[row][col + 1]; boolean multiple = strg[row + 1][col]; ans = blank || multiple; } else { ans = false; } strg[row][col] = ans; } } } return strg[0][0]; } public static void main(String[] args) { String src = "aa"; String pat = "*"; System.out.println("Method 1: "+regexRecursion(src, pat)); System.out.println("Method 2: "+regexRecursion(src, pat, 0, 0)); System.out.println("Method 3: "+regexRecursion(src, pat, 0, 0, new int[src.length()][pat.length()])); System.out.println("Method 4: "+regexBU(src, pat)); } } // Memoization vs Tabulation : https://www.geeksforgeeks.org/tabulation-vs-memoization/ // Question Link : https://practice.geeksforgeeks.org/problems/wildcard-pattern-matching/1 |
| You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |