leetcode 10 正则表达式匹配
- 题目说明: 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。
- 题目链接:添加链接描述
- 解题思路:采用动态规划进行求解,dp[i][j]表示s的前i个字符串能否和p的前j个字符串进行匹配。初始时dp[0][0]皆为true。
则当s[i]=p[j]||p[j]=’.‘时,dp[i][j]=dp[i-1][j-1]|dp[i][j]
当p[j]==’*'时,若 j>=2j>=2,dp(i,j) 可以从 dp(i,j−2)转移,表示丢弃这一次的 ‘’ 和它之前的那个字符;若 i>0i>0 且 s(i) == p(j - 1),表示这个字符可以利用这个 '’,则可以从 dp(i−1,j) 转移,表示利用 ‘*’。 - 代码如下:
class Solution {
public:
bool isMatch(string s, string p) {
int n=s.size();
int m=p.size();
vector<vector<bool>> dp(n+1,vector<bool>(m+1,false));
s=" "+s;
p=" "+p;
dp[0][0]=true;
for(int i=0;i<=n;i++){
for(int j=1;j<=m;j++){
if(i>0&&(s[i]==p[j]||p[j]=='.')){
dp[i][j]=dp[i][j]|dp[i-1][j-1];
}
if(p[j]=='*'){
if(j>=2){
dp[i][j]=dp[i][j]|dp[i][j-2];
}
if(i>0&&(s[i]==p[j-1]||p[j-1]=='.')){
dp[i][j]=dp[i][j]|dp[i-1][j];
}
}
}
}
return dp[n][m];
}
};