LeetCode第44题:通配符匹配(困难)

LeetCode第44题:通配符匹配(困难)

  • 题目:给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 ‘?’ 和 ‘’ 的通配符匹配。’?’ 可以匹配任何单个字符。’’ 可以匹配任意字符串(包括空字符串)。两个字符串完全匹配才算匹配成功。
  • 解法一:想根据p的字符分成’’、’?‘和字母三类,然后进行判断。但是’'的情况有些复杂,尝试很多次后,通过率最高的解法如下:
class Solution {
    public boolean isMatch(String s, String p) {
        int len1=s.length();
        int len2=p.length();
        int i,j;
        if(len1==0 || len2==0 || len2>len1)  return false;
        for(i=0,j=0;i<len1 && j<len2;){
            if(p.charAt(j)=='?'){
                i++;
                j++;
            }else if(p.charAt(j)=='*'){
                if(j==len2-1) return true;
                j++;
                while(i<len1 && p.charAt(j) != s.charAt(i)){
                    i++;
                }
                //if(i==len1-1 && j==len2-1) return true;
                if((i==len1-1 && j!=len2-1) || (i !=len1-1 && j==len2-1)) return false;
                i++;
                j++;
            }else{
                if(p.charAt(j) == s.charAt(i)){
                    i++;
                    j++;
                }else{
                    if(j>1 && p.charAt(j-2)=='*'){
                        //return true;
                        j--;
                        while(i<len1 && p.charAt(j) != s.charAt(i)){
                            i++;
                        }
                        //if(i==len1-1 && j==len2-1) return true;
                        if((i==len1-1 && j!=len2-1) || (i !=len1-1 && j==len2-1)) return false;
                        i++;
                        j++;
                    }else{
                         return false;
                    }
                   
                }
            }
        }
        if(i==len1 && j==len2) return true;
        return false;
    }
}

在这里插入图片描述

  • 解法二:题解里的一种神仙算法,应该也是采用了回溯思想吧,不匹配的时候通过start判断前面是否有’*’,好腻害呀
class Solution {
    public boolean isMatch(String s, String p) {
        int sn = s.length();
        int pn = p.length();
        int i = 0;
        int j = 0;
        int start = -1;
        int match = 0;
        
        while (i < sn) 
        {
            if (j < pn && (s.charAt(i) == p.charAt(j) || p.charAt(j) == '?')) 
            {
                i++;
                j++;
            } 
            else if (j < pn && p.charAt(j) == '*') 
            {
                start = j;
                match = i;
                j++;
            } 
            else if (start != -1) 
            {
                j = start + 1;
                i = ++match;
            } 
            else 
            {
                return false;
            }
        }
        
        while (j < pn) 
        {
            if (p.charAt(j) != '*') 
            	return false;
            j++;
        }
        return true;
    }
}

发布了79 篇原创文章 · 获赞 7 · 访问量 1394

猜你喜欢

转载自blog.csdn.net/new_whiter/article/details/103700173