44. Wildcard Matching

一、题目

  1、审题

  2、分析:

    判断两个字符串是否匹配,其中 p 中的特殊字符 ‘?’可以匹配任意一个字母, ‘*’ 可以匹配 0 个或多个不同的连续字符。

二、解答

  1、思路:

    ①、定义两个指针,pIndex 指向 p 的下标, sIndex 指向 s 的下标;

     再定义两个指针,pStarIndex 指向 p 中最新出现的星号出现时的后一个字符的位置, sMatch 指向 s 中当前确定要匹配入星号中的字符的下标;

    ②、在 sIndex 指向未超出 s 范围时,

      a、当 s 与 p 单个字符匹配时, sIndex 与 pIndex 均向后移动一个单位;

      b、当 p 中出现 ‘*’ 时,pStarIndex 记录 p 下标,且 pIndex 向后移动一个单位, sIndex 当前保持不变(即去除‘*’开始假使能够匹配当前字符串);

      c、当出现字符不匹配时,pIndex 立马指向星号后一个字符,即 s中此字符算入 p中‘*’ 的匹配范围内;

    ③ 若 sIndex 已经指完最后一个字符时, 判断 pIndex 是否已经指完 p 的字符,或者 p 的后续字符只剩下 ‘*’,此时返回 true,否则 false;

public boolean isMatch(String s, String p) {
        
        int sIndex = 0, pIndex = 0;    // s、p 遍历时的下标
        int sMatch = 0;            // 记录 s 开始与 p 的星号开始 匹配的下标
        int pStarIndex = - 1;    // p 星号的 下表
        
        while(sIndex < s.length()) {
            
            if(pIndex < p.length() &&
                    (p.charAt(pIndex) == '?' ||
                        p.charAt(pIndex) == s.charAt(sIndex))) {
                sIndex++;
                pIndex++;
            }
            else if(pIndex < p.length() && p.charAt(pIndex) == '*') {
                pStarIndex = pIndex++;    // pIndex 向后移动
                sMatch = sIndex;        // sIndex 不移动
            }
            else if(pStarIndex != -1) {        // p与s字符不匹配时,p 中存在 *
                pIndex = pStarIndex + 1;    // pIndex 重新从星号后边开始
                sIndex = ++sMatch;
                
            }
            else 
                return false;
            
        }
        
        while(pIndex < p.length() && p.charAt(pIndex) == '*')
            pIndex++;
        return pIndex == p.length();
    }

   

  2、有时间研究这篇大佬博客  

      https://blog.csdn.net/jmspan/article/details/51460021

原文地址:https://www.cnblogs.com/skillking/p/9610729.html