LeetCode_10 Regular Expression Matching
2016-01-27 13:23
369 查看
This is the linkage to this problem: 点击打开链接
Similar question: None by now
Implement regular expression matching with support for
We can use both recursive method dynamic programming to solve this problem.
1.Recursive method:
2.Dynamic programming:
Similar question: None by now
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
We can use both recursive method dynamic programming to solve this problem.
1.Recursive method:
public class Solution { public boolean isMatch(String s, String p) { if(p.length() == 0) return (s.length() == 0); if(s.length() == 0){ if(p.length() > 1 && p.charAt(1) == '*') return isMatch(s, p.substring(2)); else return false; } if(p.length() > 1 && p.charAt(1) == '*'){ if(s.charAt(0) == p.charAt(0) || p.charAt(0) == '.') return isMatch(s.substring(1), p) || isMatch(s, p.substring(2)); return isMatch(s, p.substring(2)); } if(s.charAt(0) == p.charAt(0) || p.charAt(0) == '.') return isMatch(s.substring(1), p.substring(1)); else return false; } }
2.Dynamic programming:
public class Solution { public boolean isMatch(String s, String p) { if(s == null || p == null) return false; int m = s.length(); int n = p.length(); char[] sa = s.toCharArray(); char[] pa = p.toCharArray(); boolean[][] board = new boolean[m+1][n+1]; board[0][0] = true; for(int jj = 2; jj <= n; jj++){ if(pa[jj-1] == '*'){ if(pa[jj-2] == '*') board[0][jj] = board[0][jj-1]; else board[0][jj] = board[0][jj-2]; } } for(int ii = 1; ii <= m; ii++){ for(int jj = 1; jj <= n; jj++){ if(pa[jj-1] == '*'){ if(jj == 1) continue; boolean b1 = board[ii][jj-2]; boolean b2 = board[ii][jj-1]; boolean b3 = board[ii-1][jj]; board[ii][jj] = b1 || b2 || (b3 && (sa[ii-1] == pa[jj-2] || pa[jj-2] == '.')); } else{ if(sa[ii-1] == pa[jj-1] || pa[jj-1] == '.') board[ii][jj] = board[ii-1][jj-1]; } } } return board[m] ; } }
相关文章推荐
- leetcode 179 Largest Number
- leetcode 24 Swap Nodes in Pairs
- leetcode 2 Add Two Numbers 方法1
- leetcode 2 Add Two Numbers 方法2
- leetcode----Longest Substring Without Repeating Characters
- [LeetCode]47 Permutations II
- [LeetCode]65 Valid Number
- [LeetCode]123 Best Time to Buy and Sell Stock III
- [LeetCode] String Reorder Distance Apart
- [LeetCode] Sliding Window Maximum
- [LeetCode] Find the k-th Smallest Element in the Union of Two Sorted Arrays
- [LeetCode] Determine If Two Rectangles Overlap
- [LeetCode] A Distance Maximizing Problem
- leetcode_linearList
- leetcode_linearList02
- 021-Merge Two Sorted Lists(合并两个排好序的单链表);leetcode
- LeetCode[Day 1] Two Sum 题解
- LeetCode[Day 2] Median of Two Sorted Arrays 题解
- LeetCode[Day 3] Longest Substring Without... 题解
- LeetCode [Day 4] Add Two Numbers 题解