可以想想一些问题可不可以转化为递归
要看一下尾递归转迭代!

#include <iostream>  
#include <stdio.h>  
#include <string.h>  
using namespace std;  
  
class Solution {  
public:  
    bool isMatch(const char *s, const char *p) {  
        if(s == NULL || p == NULL || *p == '*') {  
            return false;  
        }  
        if(*p == '\0') return *s == '\0';  
        //next char is not '*': must match current character  
        if(*(p+1) != '*') {  
            if(*s == '\0') return false;  
            if(*p != '.' && *p != *s) return false;  
            return isMatch(s+1,p+1);  
        }  
        //next char is '*'  
        else {  
            int slen = strlen(s);  
            if(isMatch(s,p+2)) return true;  
            for(int i = 0; i < slen; ++i) {  
                if(*p!='.' && *p != *(s+i)) return false;  
                if(isMatch(s+i+1,p+2)) return true;  
            }  
            return false;  
        }  
    }  
};  
  
int main() {  
    Solution solution;  
    char* s = "abcbcd";  
    char* p = "ab*bbc";  
    bool result = solution.isMatch(s,p);  
    cout<<result<<endl;  
    return 0;  
}

我的java解法,注意的关键点为

  • 注意在*的情况下字母相等和.的吞字母情况是不同的。.的情况是要迭代各种屯字母的个数,字母相同的情况是一个不吞字母,另一个是吞了一个字母。

  • 另外一个注意的是当s长度为0的情况

public class Solution {
    public boolean isMatch(String s, String p) {
        return isMatchWithPointer(s, p, 0, 0);
    }
    
    
    public boolean isMatchWithPointer(String s, String p, int i, int j) {
        if (j >= p.length()) {
            if (i >= s.length()) {
                return true;
            } else {
                return false;
            }
        }
        
        if (j == p.length() - 1 || p.charAt(j+1) != '*') {
            if (i >= s.length()) {
                return false;
            }
            
            if (s.charAt(i) != p.charAt(j) && p.charAt(j) != '.') {
                return false;
            } else {
                return isMatchWithPointer(s, p, i+1, j+1);
            }
        } else {
            
            if (i >= s.length()) {
                return (isMatchWithPointer(s, p, i, j+2));
            }
            
            if (s.charAt(i) == p.charAt(j) || p.charAt(j) == '.') {
                // 需要注意以.开头和ij相等的情况要分别处理,在这里 就是要穷举*吞掉s字母的情形
                if (p.charAt(j) == '.') {
                    for (int k = i; k <= s.length(); k++) {
                        if (isMatchWithPointer(s, p, k, j+2)) return true;
                    }
                    return false;
                } else {
                    if (isMatchWithPointer(s, p, i, j+2)) return true;
                    if (isMatchWithPointer(s, p, i+1, j)) return true;
                    return false;
                }
            } else {
                return isMatchWithPointer(s, p, i, j+2);
            }
        }
    }
}

chenatu
106 声望12 粉丝