(java)leetcode-10

    xiaoxiao2021-04-02  41

    其实这个不能说是转载吧,但是代码是别人的,所以就算是转载吧。

    Regular Expression Matching

    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算法,这两天专门看了下DP算法的知识,感觉这是一个挺神奇也挺好用的算法,但是就是思路比较难。一旦思路出来了,代码的实现还好。

    具体思路我就直接复制leetcode上别人的思路了,我觉得那个说的挺好的。

    This Solution use 2D DP. beat 90% solutions, very simple.

    Here are some conditions to figure out, then the logic can be very straightforward.

    1, If p.charAt(j) == s.charAt(i) : dp[i][j] = dp[i-1][j-1]; 2, If p.charAt(j) == '.' : dp[i][j] = dp[i-1][j-1]; 3, If p.charAt(j) == '*': here are two sub conditions: 1 if p.charAt(j-1) != s.charAt(i) : dp[i][j] = dp[i][j-2] //in this case, a* only counts as empty 2 if p.charAt(i-1) == s.charAt(i) or p.charAt(i-1) == '.': dp[i][j] = dp[i-1][j] //in this case, a* counts as multiple a or dp[i][j] = dp[i][j-1] // in this case, a* counts as single a or dp[i][j] = dp[i][j-2] // in this case, a* counts as empty

    [java] view plain copy print ? public boolean isMatch(String s, String p) {        if (s == null || p == null) {          return false;      }      boolean[][] dp = new boolean[s.length()+1][p.length()+1];      dp[0][0] = true;      for (int i = 0; i < p.length(); i++) {          if (p.charAt(i) == '*' && dp[0][i-1]) {              dp[0][i+1] = true;          }      }      for (int i = 0 ; i < s.length(); i++) {          for (int j = 0; j < p.length(); j++) {              if (p.charAt(j) == '.') {                  dp[i+1][j+1] = dp[i][j];              }              if (p.charAt(j) == s.charAt(i)) {                  dp[i+1][j+1] = dp[i][j];              }              if (p.charAt(j) == '*') {                  if (p.charAt(j-1) != s.charAt(i) && p.charAt(j-1) != '.') {                      dp[i+1][j+1] = dp[i+1][j-1];                  } else {                      dp[i+1][j+1] = (dp[i+1][j] || dp[i][j+1] || dp[i+1][j-1]);                  }              }          }      }      return dp[s.length()][p.length()];  }   public boolean isMatch(String s, String p) { if (s == null || p == null) { return false; } boolean[][] dp = new boolean[s.length()+1][p.length()+1]; dp[0][0] = true; for (int i = 0; i < p.length(); i++) { if (p.charAt(i) == '*' && dp[0][i-1]) { dp[0][i+1] = true; } } for (int i = 0 ; i < s.length(); i++) { for (int j = 0; j < p.length(); j++) { if (p.charAt(j) == '.') { dp[i+1][j+1] = dp[i][j]; } if (p.charAt(j) == s.charAt(i)) { dp[i+1][j+1] = dp[i][j]; } if (p.charAt(j) == '*') { if (p.charAt(j-1) != s.charAt(i) && p.charAt(j-1) != '.') { dp[i+1][j+1] = dp[i+1][j-1]; } else { dp[i+1][j+1] = (dp[i+1][j] || dp[i][j+1] || dp[i+1][j-1]); } } } } return dp[s.length()][p.length()]; }

    转载请注明原文地址: https://ju.6miu.com/read-665799.html

    最新回复(0)