Q34 Wildcard Matching - LeetCode 44

PHOTO EMBED

Sat Sep 09 2023 16:36:05 GMT+0000 (Coordinated Universal Time)

Saved by @Ayush_dabas07

class Solution {
    public boolean isMatch(String s, String p) {
        //Ques 36 , dp playlist
        
        int m = p.length() , n = s.length();

        //2nd approach (recursion + memoization)    //in 1 based indexing
        // return solve(s , p , m , n , new Boolean[m+1][n+1]);

        //tabulization
        boolean dp[][] = new boolean[m+1][n+1];
        //base case
        dp[0][0] = true;
        
        for(int j = 1 ; j <= n ;j++)
        dp[0][j] = false;

        
        for(int i = 1; i <= m ; i++){
            boolean flag = true;
            for(int ii = 1; ii <= i ; ii++){
                if(p.charAt(ii - 1) !='*'){
                    flag = false;
                    break;
                }
            }
            dp[i][0] = flag;
        }
        
        for(int i = 1 ; i <= m ; i++){
            for(int j = 1 ; j<= n ;j++){
                char ch1 = p.charAt(i-1), ch2 = s.charAt(j-1);

                if(ch1 == ch2 || ch1 == '?'){
                    dp[i][j] = dp[i-1][j-1];
                }

                else if(ch1 == '*')
                dp[i][j] = dp[i-1][j] || dp[i][j-1];

                
                else
                dp[i][j] = false;
            }
        }
        return dp[m][n];
    }

     public boolean solve(String s , String p , int i , int j , Boolean[][] dp){
        if(i ==0 && j == 0) return true ;    //both exhausted == matched
        if(i == 0 && j > 0) return false;       //j remains
        
        //if s remains and its all *
        if(i > 0 && j == 0){
            for(int ii = 1 ;ii <=i ; ii++){
                if(p.charAt(ii-1) != '*' )
                return false;
            }
            return true;
        }
        
        if(dp[i][j] != null)
        return dp[i][j];

        char ch1 = p.charAt(i-1), ch2 = s.charAt(j-1);

        if(ch1 == ch2 || ch1 == '?'){
            return dp[i][j] = solve(s,p , i-1 , j-1 , dp);
        }

        //keeping * as emptry string and making a call to next char
        //keeping * as that character and making call for next char with another *
        else if(ch1 == '*')
        return dp[i][j] = solve(s ,p ,i-1 ,j , dp) || solve(s, p , i, j-1 , dp);

        //if chars are not equal 
        return dp[i][j] = false;
        
    }   
}
content_copyCOPY

https://leetcode.com/problems/wildcard-matching/