题目
请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配
思路 (动态规划)
-
建立dp[i][j]数组 代表是str前i个能否被pattern[j]个匹配
-
首先初始化dp数组的第一行,当前是与空字符串匹配。
2.1 首先想到两个都是空的时候,是匹配的,dp[0][0]=true;
2.2 若pattern不为空,则分类讨论- 若pattern[j] !=’ * ',一定是不匹配的
- 若pattern[j] == ’ * ',那么就存在p[j-1]p[j]这两个模式串使用0次,也可以匹配。 如a* 则可以等于“ ”,所以可以匹配。
-
开始比较str和pattern字符串
3.1 若pattern[j] == ‘.’||pattern[j]== str[i]:当前匹配成功
3.2 如果p[j] == ‘*’:需要进一步分情况讨论。- 若pattern== '.'或者pattern[j-1] == str[i],则pattern[j-1]pattern[j]这两个模式串可以使用1到无数次,匹配成功
- 若pattern[j-1] != '.'和pattern[j-1] != s[i]的时候,但可以使用p[j-1]p[j]这两个模式串0次,匹配成功
除了以上情况,均匹配不成功
public class Solution {
public boolean match(char[] str, char[] pattern)
{
boolean dp[][]= new boolean [str.length+1][pattern.length+1];
dp[0][0]=true;
for(int i=0;i<pattern.length;i++)
if(i>0&&pattern[i]=='*')
dp[0][i+1]=dp[0][i-1];
for(int i=0;i<str.length;i++){
for(int j=0;j<pattern.length;j++){
if(str[i]==pattern[j]||pattern[j]=='.')
dp[i+1][j+1]=dp[i][j];
if(pattern[j]=='*')
{
if(pattern[j-1]!=str[i]&&pattern[j-1]!='.')
dp[i+1][j+1]=dp[i+1][j-1];
else
dp[i+1][j+1]=dp[i][j+1]||dp[i+1][j]||dp[i+1][j-1];
}
}
}
return dp[str.length][pattern.length];
}
}
其他的题题解
剑指offer题解 java版