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 个字符匹配。
classSolution{publicbooleanisMatch(StringA,StringB){int m =A.length()+1;int n =B.length()+1;boolean[][]result =newboolean[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;elseif(result[i-1][j]&&A.charAt(i-1)==B.charAt(j-2))
result[i][j]=true;elseif(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;elseif(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];}}