剑指offer19题正则表达式

1、定义二维数组result[][],result[i][j]用于表示 A 的前 i 个字符和 B 的前 j 个字符是否匹配
2、初始化result数组:因为状态转移是从前面的状态转移到后面的状态,必须要初始化一些被转移的状态。(1)result[0][0] = true,表示两个空字符串是可以匹配的(2)初始化 result 数组的首行,A 为空的情况下,或者 A 已经被匹配成功,但是 B 还有字符。此时 B 的偶数位为 * 是可以匹配的,因为可以让 ‘*’ 之前的字符出现次数为 0 或者多次(3)result 的首列除了 result[0][0] 外全部为 False,意思是当B为空时,A 无论如何也不会被匹配上(除了 A 也为空的情况)
3、状态转移:因为已经初始化了首行和首列,A 和 B 都从索引1开始匹配:
<1> 如果 B 的第 j 个字符为 * (B[j - 1] == *)时:
(1)result[i][j - 2] 为 True 时,result[i][j] 也为 True。即如果 A 的前 i 个字符和 B 的前 j - 2 个字符匹配,这时 B 的第 j 个字符为 ‘*’,那么无论 B 的第 j-1 个字符是什么,令它出现 0 次,result[i][j]就可以为 true
(2)result[i - 1][j] && A[i - 1] == B[j - 2]为True时,result[i][j]也为 True。如果 A 的前 i - 1 个字符和 B 的前 j 个字符匹配,并且 A 的第 i 个字符和 B 的第 j - 1 个字符相等;那么让 B 的第 j - 1 个字符多出现一次,A 的前 i 字符和 B 的前 j 的字符就可以匹配了
(3)result[i - 1][j] && B[j - 2] == '.'为True时,result[i][j] 也为 True ,如果 A 的前 i - 1 个字符和 B 的前 j 个字符匹配,因为 B 的第 j - 1 个字符可以匹配任意字符;那么 A 的第 i 个字符可以匹配 B 的第 j - 1 个字符,令 B 的第 j - 1 个字符多出现一次即可
<2> 如果 B 的第j个字符不为 * (B[j - 1] != * )
(1)result[i - 1][j - 1] && A[i - 1] == B[j - 1]为True时,result[i][j]也为True。即 A 的前i - 1个字符和 B 的前 j - 1 个字符匹配,且 A 的第i个字符和 B 的第j个字符相等
(2)result[i - 1][j - 1] && B[j - 1] == '.'为True时,result[i][j]也为True。即 A 的前 i - 1 个字符和 B 的前 j - 1 个字符匹配,且 B 的第 j 个字符可以和任意字符匹配;那么 A 的第 i 个字符可以和 B 的第 j 个字符匹配。
class Solution {
    public boolean isMatch(String A, String B) {
        int m = A.length()+1;
        int n = B.length()+1;
        boolean [][]result = new boolean[m][n];
        result[0][0] = true;
        //初始化首行
        for(int j = 2; j < n;j = j + 2)
            result[0][j] = result[0][j-2] && B.charAt(j-1) == '*';
        //初始化首列
        for(int i = 1 ;i < m;i++)
            result[i][0] = false;
        //状态转移
        for(int i = 1 ;i < m; i++){
            for(int j = 1;j < n; j++ ){
                if(B.charAt(j - 1) == '*'){
                    if(result[i][j-2])
                        result[i][j] = true;
                    else if(result[i-1][j]&&A.charAt(i-1)==B.charAt(j-2))
                        result[i][j] = true;
                    else if(result[i-1][j]&&B.charAt(j-2)=='.')
                        result[i][j] = true;
                }else{
                    if(result[i-1][j-1]&&A.charAt(i-1)==B.charAt(j-1))
                        result[i][j] = true;
                    else if(result[i-1][j-1] && B.charAt(j-1)=='.')
                        result[i][j] = true;
                }
                /*result[i][j]=B.charAt(j-1)=='*'?result[i][j-2]||result[i-1][j]
                             &&A.charAt(i-1)==B.charAt(j-2)||result[i-1][j]&&B.charAt(j-2)=='.'
                             :result[i-1][j-1]&&A.charAt(i-1)==B.charAt(j-1)||result[i-1][j-1]
                             &&B.charAt(j-1)=='.';*/
            }
        }
        return result[m-1][n-1];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值