【leetcode-10】——Regular Expression Matching

【leetcode-10】——Regular Expression Matching

题目
Given an input string (s) and a pattern §, 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).

Note:

s could be empty and contains only lowercase letters a-z. p could be
empty and contains only lowercase letters a-z, and characters like .
or *.
Example 1:

Input: s = “aa” p = “a” Output: false Explanation: “a” does not match
the entire string “aa”.
Example 2:
Input: s = “aa” p = “a*” Output: true Explanation: '’ means zero or
more of the preceding element, ‘a’. Therefore, by repeating ‘a’ once,
it becomes “aa”.
Example 3:
Input: s = “ab” p = ".
" Output: true Explanation: “." means "zero or
more (
) of any character (.)”.
Example 4:
Input: s = “aab” p = “cab” Output: true Explanation: c can be
repeated 0 times, a can be repeated 1 time. Therefore, it matches
“aab”.
Example 5:
Input: s = “mississippi” p = “misisp*.” Output: false

 使用动态规划解答 
 定义:dp[sl+1][pl+1] 
 当dp[i][j]   为ture时表示s从0-i与p从0-j匹配
 当dp[i][j]false时表示s从0-i与p从0-j不匹配
 初始值
 (1)dp[0][0]=true  
        表示 零串与零模式串匹配
 (2)dp[i][0]=false
        表示 非零串与零模式串不匹配
 (3)dp[0][j] 表示零串与非零模式串的匹配情况
       dp[0][1]=false;
       如果p的第j个字符串不为"*",那么一定不匹配,则 dp[0][j]=false;
       如果p的第j个字符串为"*" ,dp[0][j] = dp[0][j - 2]
       

1.  如果s.charAt(i-1) == p.charAt(j-1)
    那么dp[i][j] = dp[i - 1][j - 1];
2.  如果p.charAt(j-1)== '.'
    那么dp[i][j] = dp[i - 1][j - 1];
3.  如果p.charAt(j-1) == '*'
    3.1 如果当前字符与模式串的前一个字符相同或者模式串的前一个字符为.
         那么  dp[i][j] = dp[i][j - 1] || dp[i - 1][j]|| dp[i][j - 2];
    3.2 否则   dp[i][j] = dp[i][j - 2];
     
         
 
public class Solution10 {
	public static boolean isMatch(String s, String p) {
		int sl=s.length();
		int pl=p.length();		
		boolean  dp[][]=new boolean[sl+1][pl+1];
		//初始化
		dp[0][0]=true;
		//初始化首列
		for(int i = 1; i <= sl; i++){
            dp[i][0] = false;
        }
		
        // 初始化首行
        for(int j = 1; j <= pl; j++){
            if(j == 1 || p.charAt(j-1) != '*') 
            	dp[0][j] = false;
            else dp[0][j] = dp[0][j - 2];

        }
        for(int i = 1; i <= sl; i++){
            for(int j = 1; j <= pl; 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(s.charAt(i-1) == p.charAt(j-2) || p.charAt(j-2) == '.'){
                    	
                    	
                    		 dp[i][j] = dp[i][j - 1] || dp[i - 1][j]|| dp[i][j - 2];
                    	
                        
                    }
                    else{
                        dp[i][j] = dp[i][j - 2];
                    }
                }
            }
        }
		
		return dp[sl][pl];     
    }
	public static void main(String[] args) {
		String s = "aab",p = "c*a*b";
		boolean f=Solution10.isMatch(s, p);
		System.out.print(f);
		
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LeetCode-Editor是一种在线编码工具,它提供了一个用户友好的界面编写和运行代码。在使用LeetCode-Editor时,有时候会出现乱码的问题。 乱码的原因可能是由于编码格式不兼容或者编码错误导致的。在这种情况下,我们可以尝试以下几种解决方法: 1. 检查文件编码格式:首先,我们可以检查所编辑的文件的编码格式。通常来说,常用的编码格式有UTF-8和ASCII等。我们可以将编码格式更改为正确的格式。在LeetCode-Editor中,可以通过界面设置或编辑器设置来更改编码格式。 2. 使用正确的字符集:如果乱码是由于使用了不同的字符集导致的,我们可以尝试更改使用正确的字符集。常见的字符集如Unicode或者UTF-8等。在LeetCode-Editor中,可以在编辑器中选择正确的字符集。 3. 使用合适的编辑器:有时候,乱码问题可能与LeetCode-Editor自身相关。我们可以尝试使用其他编码工具,如Text Editor、Sublime Text或者IDE,看是否能够解决乱码问题。 4. 查找特殊字符:如果乱码问题只出现在某些特殊字符上,我们可以尝试找到并替换这些字符。通过仔细检查代码,我们可以找到导致乱码的特定字符,并进行修正或替换。 总之,解决LeetCode-Editor乱码问题的方法有很多。根据具体情况,我们可以尝试更改文件编码格式、使用正确的字符集、更换编辑器或者查找并替换特殊字符等方法来解决这个问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值