LeetCode正则表达式匹配
题目描述 给你一个字符串? ‘.‘ 匹配任意单个字符 ‘*‘ 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖?整个字符串?s的,而不是部分字符串。 说明: s?可能为空,且只包含从?a-z?的小写字母。 输入: s = "aa" 输入: s = "aa" 输入: s = "ab" 输入:
当问题简单的时候,假设题中就单纯的是两个普通的字符串的匹配,可以采用下面的方法去匹配 public boolean isMatch(String s,String p) { if(p.isEmpty()) return s.isEmpty(); boolean first_flag = !s.isEmpty() && s.charAt(0) == p.charAt(0); return first_flag && isMatch(s.substring(1),p.substring(1)); } 此时慢慢对问题进行复杂化,如果加上一个 public boolean isMatch(String s,String p) { if(p.isEmpty()) return s.isEmpty(); boolean first_flag = !s.isEmpty() && (s.charAt(0) == p.charAt(0) || p.charAt(0) == ‘.‘); return first_flag && isMatch(s.substring(1),p.substring(1)); } 继续对问题复杂化,加入 public boolean isMatch(String s,String p) { if(p.isEmpty()) return s.isEmpty(); boolean first_flag = !s.isEmpty() && (s.charAt(0) == p.charAt(0) || p.charAt(0) == ‘.‘); if( p.length() >= 2 && p.charAt(1) == ‘*‘){ return first_flag && isMatch(s.substring(1),p) || isMatch(s,p.substring(2)); }else return first_flag && isMatch(s.substring(1),p.substring(1)); } 2. 动态规划 用 1. 若 if(p[j-1] != ‘*‘ `) dp[i][j] = i>0 && dp[i-1][j-1] && (s[i-1] == p[j-1] || p[j-1] = ‘.‘)
if(p[j-1] == ‘*‘ `) dp[i][j] = dp[i][j - 2] || (i > 0 && (s[i - 1] == p[j - 2] || p[j - 2] == ‘.‘) && dp[i - 1][j]); 综上可知: public boolean isMatch(String s,String p) { int m = s.length(); int n = p.length(); boolean[][] dp = new boolean[m+1][n+1]; boolean[] sss = new boolean[n+1]; Arrays.fill(sss,false); Arrays.fill(dp,sss); dp[0][0] = true; for (int i = 0; i <= m; i++) for (int j = 1; j <= n; j++) if ( p.charAt(j-1) == ‘*‘) dp[i][j] = dp[i][j - 2] || (i > 0 && (s.charAt(i - 1) == p.charAt(j - 2) || p.charAt(j-2) == ‘.‘) && dp[i - 1][j]); else dp[i][j] = i > 0 && dp[i - 1][j - 1] && (s.charAt(i - 1) == p.charAt(j - 1) || p.charAt(j - 1) == ‘.‘); return dp[m][n]; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |