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
| class Solution { public: vector<int> kmp(string p) { vector<int> next(p.length() + 1,0);
for (int i = 0; i < p.length() + 1; i++) { if (i == 0 || p[i - 1] == '*') { next[i] = i; continue; } for (int j = i - 1; j >= 0; j--) { bool flag = true; for (int k = j-1; k >= 0; k--) { if (p[k] == '*') { break; } else if (p[k] != p[i - (j - k)] && p[k] != '?' && p[i - (j - k)] != '?') { flag = false; break; } } if (flag == true) { next[i] = j; break; } } } return next; } bool isMatch(string s, string p) { if (p.empty()) { if (s.empty()) { return true; } else { return false; } } vector<int> next = kmp(p); int index = 0; for (int i = 0; i < s.length();) { if (index == 0 && i > 0) { break; } else if (index != p.length() && p[index] == '?') { i++; index++; } else if (index == p.length() && p[p.length() - 1] == '*') { break; } else if (index != p.length() && p[index] == '*') { index++; } else if (index != p.length() && s[i] == p[index]) { i++; index++; } else if (index != p.length() && index == next[index]) { i++; } else { int ii; int jj; bool flag = false; while (!flag) { ii = index; index = next[index]; jj = index; flag = true; for (int k = jj - 1; k >= 0; k--) { if (p[k] == '*') { break; } if (p[ii - jj + k] == '?' && p[k] != '?') { if (p[k] != s[i - (jj - k)]) { flag = false; break; } }
if (k == 0 && i - (jj - k) > 0) { flag = false; break; } } } } } while (p[index] == '*') { index++; } if (index == p.length()) { return true; } else { return false; } } };
|