• Leetcode:44. Wildcard Matching


    Description

    Implement wildcard pattern matching with support for '?' and '*'.

    Example

    '?' Matches any single character.
    '*' Matches any sequence of characters (including the empty sequence).
    
    The matching should cover the entire input string (not partial).
    
    The function prototype should be:
    bool isMatch(const char *s, const char *p)
    
    Some examples:
    isMatch("aa","a") → false
    isMatch("aa","aa") → true
    isMatch("aaa","aa") → false
    isMatch("aa", "*") → true
    isMatch("aa", "a*") → true
    isMatch("ab", "?*") → true
    isMatch("aab", "c*a*b") → false
    

    思路

    • 思路一:递归,TLE
    • 思路二:迭代回溯,两个指针
      • is:指向s的下一次迭代的位置,初始为同p的'*'对应位置,然后以后的每一次迭代加1
      • ip: 指向p的最近的一个'*'的位置

    代码

    • 递归超时。
    bool isMatch(string s, string p) {
    		int slen = s.size(), plen = p.size();
    		string pattern;
    		int j = 0;
    		while (j < plen){
    			if (j > 0 && p[j] == '*' && p[j - 1] == p[j]){
    				j++;
    				continue;
    			}
    			pattern += p[j++];
    		}
    		return helper(s, slen, 0, pattern, pattern.size(), 0);
    	}
    
    	bool helper(string &s, int slen, int i, string &p, int plen, int j){
    		if (i == slen && j == plen) return true;
    		if (j == plen) return false;
    		if (i == slen) return p[j] == '*' ? helper(s, slen, i, p, plen, j + 1) : false;
    
    		if (s[i] == p[j] || p[j] == '?')
    			return helper(s, slen, i + 1, p, plen, j + 1);
    		else if (p[j] == '*'){
    			bool flag = false;
    			while (j + 1 < plen && p[j + 1] == p[j]) j++;
    
    			flag = helper(s, slen, i + 1, p, plen, j);
    			if (!flag && j + 1 < plen && (p[j + 1] == s[i] || p[j + 1] == '?'))
    				flag = helper(s, slen, i, p, plen, j + 1);
    
    			return flag;
    		}
    
    		else return false;
    	}
    
    • 迭代回溯
    class Solution {
    public:
       bool isMatch(string s, string p) {
    		int slen = s.size(), plen = p.size();
    		
    		int i = 0, j = 0, is = -1, ip = -1;
    		while(i < slen){
    		    if(p[j] == '*'){
    		        is = i;
    		        ip = j++;
    		    }
    		    else{
    		        if(s[i] == p[j] || p[j] == '?'){
    		            i++;
    		            j++;
    		        }
    		        else if(ip == -1) return false;
    		        else {
    		            i = ++is;
    		            j = ip + 1;
    		        }
    		    }
    		}
    		
    		while(j < plen && p[j] == '*') j++;
    		return j == plen;
    	}
    };
    
  • 相关阅读:
    Java如何让线程池满后再存放队列
    Java如何让线程池满后再存放队列
    Hystrix 中线程池隔离与信号量隔离区别
    微服务中服务间feign调用header传参
    JVM 垃圾收集器
    java对象引用与垃圾收集器回收算法
    JVM 中 java 对象布局
    类加载器与双亲委派机制
    sql 查询本周周一与周日时间
    VUE组件循环引用
  • 原文地址:https://www.cnblogs.com/lengender-12/p/6846090.html
Copyright © 2020-2023  润新知