#leetcode#Wildcard Matching

本文介绍了一种实现通配符匹配的算法,该算法支持‘?’和‘*’两种通配符,其中‘?’可以匹配任意单个字符,而‘*’可以匹配任意序列的字符。文章提供了一个具体的Java实现案例,并分析了其时间复杂度为O(m*n),适用于完全字符串匹配场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Implement wildcard pattern matching with support for '?' and '*'.

'?' Matches any single character.
'*' Matches any sequence of characters (including the empty sequence).

The matching should cover the entire input string (not partial).

The function prototype should be:
bool isMatch(const char *s, const char *p)

Some examples:
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "*") → true
isMatch("aa", "a*") → true
isMatch("ab", "?*") → true
isMatch("aab", "c*a*b") → false

Two pointers..

https://leetcode.com/discuss/10133/linear-runtime-and-constant-space-solution

 

public class Solution {
    public boolean isMatch(String s, String p) {
        int i = 0, j = 0, starIdx = -1, match = 0;
        
        while( i < s.length()){
            // if current s[i] and p[j] match, s & both move forward
            if(j < p.length() && (p.charAt(j) == '?' || p.charAt(j) == s.charAt(i))){
                i++;
                j++;
            }
            // if p[j] is '*', mark index of '*' and current match index of s, which is current i, j++ which means current * is empty sequence
            else if(j < p.length() && p.charAt(j) == '*'){
                starIdx = j;
                match = i;
                j++;
            }
            // current s[i] and p[j] does not match, 
            // and p[j] is not '*', then we'll see if there is any '*' in front of current j, 
            // if not, return false, 
            // if there is a '*', then move j back to the next char of '*', and move i back to the next of match position, 
            // which is equal to '*' is matching only one character of s[match], 
            // if the next loop still same case as this one, then the '*' will match two characters after match in s, and so on... 
            else if(starIdx != -1){
                j = starIdx + 1;
                match++;
                i = match;
            }else{
            // here is the case: p[j] and s[i] doesn't match; 
            // p[j] is not '*'; no '*' before current j. return false;
                return false;
            }
        }
        
        while(j < p.length() && p.charAt(j) == '*'){
            j++;
        }
        
        return j == p.length();
    }
}

Time complexity is O(n ^ 2)  ?.. not sure

Quote:

it is O(m*n) in worst cases, consider below input:

s = "aaaaaaaaaaaaaaaaaaaa"

p = "*aaaaaaaaaaaaaaaaaab"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值