zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩 从SC表中选取score小于60的,并group by sid,having count 大于1
    SQL经典实例书上的数据代码
    mysql练习题
    mysql中alter语句
    如何解决SSH登录Solaris主机速度慢的问题
    Solaris10安装配置LDAP(iPlanet Directory Server )
    Oracle 11g oracle 用户密码过期问题 (ZT)
    Changing Controller Numbers in Solaris
    SPARC T4 RAID Setup (ZT)
    Oracle11g 配置DG broker
  • 原文地址:https://www.cnblogs.com/skillking/p/9610729.html
Copyright © 2011-2022 走看看