题目描述:

通配符匹配 - 图1

代码实现:

  • 回溯法,本题主要的难点在于如何解决’‘的问题,由于’‘可以匹配任意长度的字符串,那么我们就可以通过记录‘’的位置通过回溯的方法来解决这个问题,先让 ‘’匹配 0 个字符,如果匹配 0 个字符不成功,则根据之前记录的 sStarIdx 和 pStarIdx 回溯到这个地方,再让‘*’匹配 1 个字符,如果匹配 1 个字符也不成功,则继续回溯回来,匹配 2 个字符,以此类推。
  • 时间复杂度:O(min(S,P))
  1. /**
  2. * @param {string} s
  3. * @param {string} p
  4. * @return {boolean}
  5. */
  6. var isMatch = function(s, p) {
  7. var sIdx = 0, pIdx = 0, sStarIdx = -1, pStarIdx = -1
  8. while (sIdx < s.length) {
  9. if (pIdx < p.length && (s[sIdx] === p[pIdx] || p[pIdx] === '?')) {
  10. sIdx++
  11. pIdx++
  12. } else if (pIdx < p.length && p[pIdx] === '*') {
  13. sStarIdx = sIdx
  14. pStarIdx = pIdx++
  15. } else if (pStarIdx > -1) {
  16. sIdx = ++sStarIdx
  17. pIdx = pStarIdx + 1
  18. } else {
  19. return false
  20. }
  21. }
  22. while (pIdx < p.length) {
  23. if (p[pIdx++] !== '*') {
  24. return false
  25. }
  26. }
  27. return true
  28. };

通配符匹配 - 图2