leetcode * * 10. 정규 표현 식 일치 (연구 대기)

[제목] * * 10. 정규 표현 식 일치
* * 10. 정규 표현 식 일치 * * 44. 어댑터 일치
문자열 s 와 문자 규칙 p 를 드 립 니 다. '..' 와 '*' 를 지원 하 는 정규 표현 식 이 일치 하 는 것 을 실현 하 십시오.
'.' 일치 하 는 임의의 단일 문자 '*' 는 0 개 이상 의 앞 에 있 는 요소 와 일치 합 니 다. 일치 하 는 것 은 일부 문자열 이 아 닌 전체 문자열 s 를 포함 하 는 것 입 니 다.
설명: s 는 비어 있 을 수 있 으 며 a - z 에서 소문 자로 만 포 함 됩 니 다.p 는 비어 있 을 수 있 으 며 a - z 의 소문 자 와 문자, 그리고 * 만 포 함 됩 니 다.
예시 1:
  :
s = "aa"
p = "a"
  : false
  : "a"      "aa"      。

예시 2:
  :
s = "aa"
p = "a*"
  : true
  :    '*'                    ,            'a'。  ,    "aa"      'a'      。

예시 3:
  :
s = "ab"
p = ".*"
  : true
  : ".*"           ('*')    ('.')。

예시 4:
  :
s = "aab"
p = "c*a*b"
  : true
  :    '*'        ,   'c'   0  , 'a'      。          "aab"。

예시 5:
  :
s = "mississippi"
p = "mis*is*p*."
  : false

[문제 풀이 사고 1] 동태 기획
class Solution {
    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] = f[i][j - 2];
                    if (matches(s, p, i, j - 1)) {
                        f[i][j] = f[i][j] || f[i - 1][j];
                    }
                }
                else {
                    if (matches(s, p, i, j)) {
                        f[i][j] = f[i - 1][j - 1];
                    }
                }
            }
        }
        return f[m][n];
    }

    public boolean matches(String s, String p, int i, int j) {
        if (i == 0) {
            return false;
        }
        if (p.charAt(j - 1) == '.') {
            return true;
        }
        return s.charAt(i - 1) == p.charAt(j - 1);
    }
}

좋은 웹페이지 즐겨찾기