码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-09-09 11:37:58      阅读:281      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   color   os   io   使用   ar   

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]是否匹配.

代码如下:

bubuko.com,布布扣
 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()是否是‘(‘,如果是则弹出栈;否则压入栈。

代码如下:

bubuko.com,布布扣
 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

 

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

标签:des   style   blog   http   color   os   io   使用   ar   

原文地址:http://www.cnblogs.com/JunxuanBai/p/3961711.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!