【leetcode】【hot100】10.正則表達式

題目描述:

https://leetcode-cn.com/problems/regular-expression-matching/

解題思路: 

 

代碼實現:

 

class Solution {
public:
    bool isMatch(string s, string p) {
        if (p.empty()) return s.empty();
if (p.size() == 1) {
    return (s.size() == 1 && (s[0] == p[0] || p[0] == '.'));
}
if(p[1] == '*'){
	if(s[0] == p[0] || (!s.empty()&& p[0] == '.')){
		return isMatch(s, p.substr(2))||isMatch(s.substr(1), p);
	}
	else
		return isMatch(s, p.substr(2));
} 
else{
	if(s[0] == p[0] || (!s.empty()&& p[0] == '.')){
		return isMatch(s.substr(1), p.substr(1));
    }
	else
		return false;
	
    }
  }
};

 劍指offer裏參數類型爲char*

class Solution {
public:
    bool match(char* str, char* pattern)
    {
        if(*str == '\0' && *pattern == '\0')
            return true;
        if(*str != '\0'&&*pattern == '\0')
            return false;
        if(*(pattern+1) == '*'){
            if (*str == *pattern || (*str != '\0' && *pattern == '.'))
                return match(str, pattern+2) || match(str+1, pattern);
            else
                return match(str, pattern+2);
        }else{
            if(*str == *pattern|| *str!='\0'&&*pattern == '.')
                return match(str+1,pattern+1);
            else
                return false;
        }
    
    }
};

更簡便的寫法:

來源:https://www.cnblogs.com/grandyang/p/4461713.html

先來判斷p是否爲空,若爲空則根據s的爲空的情況返回結果。當p的第二個字符爲*號時,由於*號前面的字符的個數可以任意,可以爲0,那麼我們先用遞歸來調用爲0的情況,就是直接把這兩個字符去掉再比較,或者當s不爲空,且第一個字符和p的第一個字符相同時,再對去掉首字符的s和p調用遞歸,注意p不能去掉首字符,因爲*號前面的字符可以有無限個;如果第二個字符不爲*號,那麼就老老實實的比較第一個字符,然後對後面的字符串調用遞歸

class Solution {
public:
    bool isMatch(string s, string p) {
        if (p.empty()) return s.empty();
        if (p.size() > 1 && p[1] == '*') {
            return isMatch(s, p.substr(2)) || (!s.empty() && (s[0] == p[0] || p[0] == '.') && isMatch(s.substr(1), p));
        } else {
            return !s.empty() && (s[0] == p[0] || p[0] == '.') && isMatch(s.substr(1), p.substr(1));
        }
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章