classSolution{public:boolisMatch(strings,stringp){constintm=s.length();constintn=p.length();// dp[i][j] := true if s[0..i) matches p[0..j)vector<vector<bool>>dp(m+1,vector<bool>(n+1));dp[0][0]=true;autoisMatch=[&](inti,intj)->bool{returnj>=0&&p[j]=='.'||s[i]==p[j];};for(intj=0;j<p.length();++j)if(p[j]=='*'&&dp[0][j-1])dp[0][j+1]=true;for(inti=0;i<m;++i)for(intj=0;j<n;++j)if(p[j]=='*'){constboolnoRepeat=dp[i+1][j-1];// Min index of '*' is 1constbooldoRepeat=isMatch(i,j-1)&&dp[i][j+1];dp[i+1][j+1]=noRepeat||doRepeat;}elseif(isMatch(i,j)){dp[i+1][j+1]=dp[i][j];}returndp[m][n];}};
classSolution{publicbooleanisMatch(Strings,Stringp){finalintm=s.length();finalintn=p.length();// dp[i][j] := true if s[0..i) matches p[0..j)boolean[][]dp=newboolean[m+1][n+1];dp[0][0]=true;for(intj=0;j<p.length();++j)if(p.charAt(j)=='*'&&dp[0][j-1])dp[0][j+1]=true;for(inti=0;i<m;++i)for(intj=0;j<n;++j)if(p.charAt(j)=='*'){finalbooleannoRepeat=dp[i+1][j-1];// Min index of '*' is 1finalbooleandoRepeat=isMatch(s,i,p,j-1)&&dp[i][j+1];dp[i+1][j+1]=noRepeat||doRepeat;}elseif(isMatch(s,i,p,j)){dp[i+1][j+1]=dp[i][j];}returndp[m][n];}privatebooleanisMatch(finalStrings,inti,finalStringp,intj){returnj>=0&&p.charAt(j)=='.'||s.charAt(i)==p.charAt(j);}}
classSolution:defisMatch(self,s:str,p:str)->bool:m=len(s)n=len(p)# dp[i][j] := True if s[0..i) matches p[0..j)dp=[[False]*(n+1)for_inrange(m+1)]dp[0][0]=TruedefisMatch(i:int,j:int)->bool:returnj>=0andp[j]=='.'ors[i]==p[j]forj,cinenumerate(p):ifc=='*'anddp[0][j-1]:dp[0][j+1]=Trueforiinrange(m):forjinrange(n):ifp[j]=='*':noRepeat=dp[i+1][j-1]# Min index of '*' is 1doRepeat=isMatch(i,j-1)anddp[i][j+1]dp[i+1][j+1]=noRepeatordoRepeatelifisMatch(i,j):dp[i+1][j+1]=dp[i][j]returndp[m][n]