LeetCode中的动态规划问题(一)

Regular Expression Matching

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

解题思路:

不是显式DP问题(保存一张表),用Recursion的思路可解。

1)若p[j+1] != '*',那么判断p[j]和s[i]的结果就可以了。

  p[j]==s[i]或者p[j]=='.',到当前位置是匹配的,继续向下判断;不满足条件,说明当前位置不匹配。

2)若p[j+1]=='*',那么需要循环判断p[j+2]和s[i...n]是否匹配.

代码如下:

 1 class Solution {
 2 public:
 3     bool isMatch(const char *s, const char *p) {
 4          if(*p == 0)
 5             return *s == 0;
 6             
 7         if(*(p+1) != '*')
 8         {
 9             if(*s != 0 && (*p == *s || *p == '.'))
10                 return isMatch(s+1, p+1);
11             else
12                 return false;
13         }
14         else
15         {
16             while(*s != 0 && (*p == *s || *p == '.'))
17             {
18                 if(isMatch(s, p+2))
19                     return true;
20                 
21                 s++;
22             }
23             return isMatch(s, p+2);
24         }
25     }
26 };
View Code

 

Longest Valid Parentheses

Problem description:

 

Given a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring.

For "(()", the longest valid parentheses substring is "()", which has length = 2.

Another example is ")()())", where the longest valid parentheses substring is "()()", which has length = 4.

解题思路:

不是用DP解决的,用stack解决。使用pair<char, int>保存字符和位置。

1)如果s[i]=='(',则压入栈;

2)如果s[i]==')',则判断st.top()是否是'(',如果是则弹出栈;否则压入栈。

代码如下:

 1 class Solution {
 2 public:
 3     int longestValidParentheses(string s) {
 4         stack<pair<char,int> > st;
 5         int len = s.length();
 6         
 7         if(len <= 1)
 8             return 0;
 9         
10         pair<char,int> start(')',-1);
11         st.push(start);
12         int res = 0;
13         for(int i = 0; i < len; ++i)   
14         {
15             if(s[i] == '(')
16             {
17                 pair<char,int> node(s[i],i);
18                 st.push(node);
19             }
20             else
21             {
22                 pair<char,int> top = st.top();
23                 if(top.first == '(')
24                 {
25                     st.pop();
26                     res = max(res, i-st.top().second);
27                 }
28                 else
29                 {
30                     pair<char,int> node(s[i],i);
31                     st.push(node);
32                 }
33                     
34             }
35         }
36         
37         return res;
38     }
39 };
View Code

 

posted @ 2014-09-08 21:04  WilliamTurran  阅读(351)  评论(0编辑  收藏  举报