以下题号均为LeetCode题号,便于查看原题。
10. Regular Expression Matching
题意:实现字符串的正则匹配,包含‘.‘ 和 ‘*‘。‘.‘ 匹配任意一个字符,"*" 匹配 ‘*‘ 之前的0个或多个字符。
example:
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
思路:输入字符串 s[0...m] 和 p[0...n]
f[i][j] 表示 s[0..i-1] 和 p[0..j-1] 匹配,我们需要判断 s 和 p 是否匹配,就是求 f[m][n] 的值是否为true,所以要往后更新 f[i][j] 的值。
更新思路如下:
1、if p[j-1]!=‘*‘, f[i][j] = f[i-1][j-1] & (s[i-1]==p[j-1] || p[j-1]==‘.‘)
2、if p[j-1]==‘*‘, 看 ‘*‘ 匹配多少个字符,即匹配多少个p[j-2]。
如果 ‘*‘ 匹配0个字符,此时,p[0...j-1]==p[0...j-3],f[i][j]=f[i][j-2];
如果 ‘*‘ 匹配1个字符,此时,p[0...j-1]==p[0...j-2],f[i][j]=f[i][j-1];
如果 ‘*‘ 匹配多个字符,此时,p[0...j-1]=={ p[0: j-2], p[j-2], ... , p[j-2] },f[i][j]=(s[i-1]==p[j-2] || p[j-2]==‘.‘) & f[i-1][j]
public boolean isMatch(String s, String p) { int m = s.length(); int n = p.length(); boolean[][] f = new boolean[m+1][n+1]; f[0][0] = true; for (int i = 0; i <= m; i++) { for (int j = 1; j <= n; j++) { if(p.charAt(j-1)!=‘*‘) { f[i][j] = i>0 && f[i-1][j-1] && (s.charAt(i-1)==p.charAt(j-1) || p.charAt(j-1)==‘.‘); } else { f[i][j] = (j>1&&f[i][j-2]) || (i>0&&(s.charAt(i-1)==p.charAt(j-2)||p.charAt(j-2)==‘.‘)&&f[i-1][j]); } } } return f[m][n]; }
时间: 2024-10-26 15:21:54