10.正则表达式匹配-LeetCode10 -java

题目:给你一个字符串s和一个字符规律p,请你来实现-个支持      '.'   和  '*'   的正则表达式匹配。
 '.'   匹配任意单个字符
'*’   匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖整个字符串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

 动态规划问题:好难的哦,也很重要。

给一个视频讲的很好:https://www.bilibili.com/video/BV1tx411E722?from=search&seid=13765190562632069472

public boolean isMatch(String s, String p) {
	    	//dp[i][j] = string s with len i matches string p with len j.这句话一定要懂
	    	//默认都是false
	    	boolean [][]dp=new boolean[s.length()+1][p.length()+1];
	    	
	    	dp[0][0]=true;
	    	//当s为null时,看p的情况 
	    	for(int i=1;i<=p.length();i++) {
	    		if( p.charAt(i-1)=='*' && dp[0][i-2]) {
	    			dp[0][i]=true;
	    		}
	    	}
	    	
	    	// s:ab
	    	// p:a.  ab  ab*  ab.*   (aa*  aa.*)
	    	for(int i=1;i<=s.length();i++) {
	    		for(int j=1;j<=p.length();j++) {
	    			if(s.charAt(i-1)==p.charAt(j-1) || p.charAt(j-1)=='.') {
	    				dp[i][j]=dp[i-1][j-1];
	    			}else if(p.charAt(j-1)=='*') {
	    				if(p.charAt(j-2)!='.' && p.charAt(j-2)!=s.charAt(i-1)) {
	    					dp[i][j]=dp[i][j-2];
	    				}else {
	    				dp[i][j]=(dp[i][j-2] || dp[i][j-1] || dp[i-1][j]);	
	    				}
	    			}
	    		}
	    	}
	    	return dp[s.length()][p.length()];
	    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值