No10-Regular Expression Matching
2017-02-21 20:20
337 查看
Problem description
Analyse
Method
最开始想出来的但是不能解决问题的算法
Analyse
Method
最开始想出来的但是不能解决问题的算法
Problem description
Implement regular expression matching with support for ‘.’ and ‘*’.'.' Matches any single character. '*' Matches zero or more of the preceding element. 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", "a*") → true isMatch("aa", ".*") → true isMatch("ab", ".*") → true isMatch("aab", "c*a*b") → true
Analyse
Method
尝试过使用最常规的方法解决。首先P字符串遇到第一个字符是的时候返回false不匹配,这是一种错误的语法。然后需要重点考虑的是遇到字符s字符串中跳过字符的问题。一般采用贪婪的跳过策略,因为本身就是一种贪婪的匹配,这种方式实现的代码能够解决一些问题。但是遇到如下的问题就会出错,比如s=abbc
p=a*bbc一旦遇到这种字符串,贪婪匹配策略失败。仔细分析代表的意义是尽可能多的匹配,所以如果在某些采用贪婪匹配失败的场合需要能够回到最初的场合重新选择匹配策略。因此这一题的解法就需要采用回朔的算法(backtracking)实现。因此实现的JavaScript代码如下:
var isMatch = function(s, p) { var ids = 0; var idp = 0; function isMatch(ids,idp){ if(idp==p.length) return ids==s.length; if(p[idp+1]!='*'){ //the next char is not * if(p[idp]!='.'&&p[idp]!=s[ids]) return false; else return isMatch(ids+1,idp+1); } else{ //the next char is * if(isMatch(ids,idp+2)) return true;//this char means nothing else{ var len = s.length-ids; for(var i=0;i<len;i++){ if(p[idp]!='.'&&p[idp]!=s[ids+i]) return false; if(isMatch(ids+i+1,idp+2)) return true; } return false; } } } if(p[0]=='*') return false; else return isMatch(ids,idp); };
最开始想出来的但是不能解决问题的算法
var isMatch = function(s, p) { if(!s||!p) return false; var ind1 = 0; var ind2 = 0; while(ind1!=s.length&&ind2!=p.length){ if(s[ind1]==p[ind2]){ if(p[ind2+1]=='*') { var temp = s[ind1]; do{ ind2++; }while(p[ind2]=='*'&&ind2<p.length); if(ind2!=p.length){ //has some char at the end of the string while(s[ind1]==temp&&ind1<s.length-p.length+ind2){ ind1++; } } else { do{ ind1++; }while(s[ind1]==temp&&ind1<s.length); } } else { ind1++; ind2++; } } else{ if(p[ind2]=='*') return false; else if(p[ind2]=='.'){ if(ind2+1<p.length&&p[ind2+1]=='*'){ do{ ind1++; ind2++; }while(p[ind2]=='*'&&ind2<p.length) } else { ind1++; ind2++; } } else{ if(ind2+1<p.length&&p[ind2+1]=='*'){ do{ ind2++; }while(p[ind2]=='*'&&ind2<p.length) } else return false; } } } if(ind2==p.length&&ind1==s.length) return true; else return false; };
相关文章推荐
- [Leetcode]10. Regular Expression Matching
- Leetcode_regular-expression-matching
- Regular Expression Matching
- LeetCode题解——Regular Expression Matching
- [leetcode]Regular Expression Matching @ Python
- LeetCode | Regular Expression Matching(未完成)
- Insert Interval & *Regular Expression Matching & Binary Tree Maximum Path Sum
- LeetCode | Regular Expression Matching
- Regular Expression Matching
- Regular Expression Matching[leetcode]直接匹配和DP
- LeetCode -- Regular Expression Matching
- LEETCODE: Regular Expression Matching
- Leetcode Regular Expression Matching 动态规划解法
- LeetCode Regular Expression Matching
- Leetcode OJ: Regular Expression Matching
- goodarticle.4-----------------Regular Expression Matching
- Regular Expression Matching
- leetcode Regular Expression Matching
- LeetCode – Refresh – Regular Expression Matching
- leetcode解题报告:10 Regular Expression Matching