字符匹配(未完成)

每日算法题之通配符匹配
今天的算法扑街了,我没搞出来,因为感觉会超时,而且边界有许多问题,时间有限,就弃了,下面是自己的半成品,打算以后有时间再试一试

给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 ‘?’ 和 ‘*’ 的通配符匹配。

‘?’ 可以匹配任何单个字符。 ‘*’ 可以匹配任意字符串(包括空字符串)。 两个字符串完全匹配才算匹配成功。

说明:

s 可能为空,且只包含从 a-z 的小写字母。 p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。 示例 1:

输入: s = “aa” p = “a” 输出: false 解释: “a” 无法匹配 “aa” 整个字符串。 示例 2:

输入: s = “aa” p = "" 输出: true 解释: '’ 可以匹配任意字符串。 示例 3:

输入: s = “cb” p = “?a” 输出: false 解释: ‘?’ 可以匹配 ‘c’, 但第二个 ‘a’ 无法匹配 ‘b’。
示例 4:

输入: s = “adceb” p = “ab” 输出: true 解释: 第一个 ‘’ 可以匹配空字符串, 第二个 '
可以匹配字符串 “dce”. 示例 5:

输入: s = “acdcb” p = “a*c?b” 输入: false

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/wildcard-matching
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

bool isMatch(char * s, char * p){
//首先可以观察到的是模式中只要有一个s中不存在的字符,那就肯定是false
//其次是 除去通配符之后,甭管对不对,p中的字母都要在s中找到一个对应
//综上,得出以下算法
//第一步,除去通配符*,并将?当作普通字符,这样p就被分成好几段,将这几段先去匹配s,剩下的用通配符去填
//第二步,根据观察可以知道,分为四种情况,头*尾*,头字尾字,头字尾*,头*尾字 。
//第三步,这样先把头尾处理掉,这样由于去头去尾后剩下分开的字段之间全是*,只要中间的给匹配上就ok了
//难点一:我去,首先我就败了,这个指针型字符数组咋找数组长度呢?strlen ok
int slength = strlen(s);
int plength =strlen(p);
char a[20] ={0};
if(p[0]=='*'&&p[strlen-1]=='*')
{
       for(int i=0;i<plength;i++)
       {
           int j=0;
           while(p[i]!='*')
           {
               a[j]=p[i];
               ++j;
               ++i;
           }
           if(j!=0)
           {
               for(int m =0;m<slength;m++)
               {
                   int n =m;
                   int x=0;
                   while(a[x]==s[m])
                   {
                       //匹配字符串
                   }
               }
           }

   }
}
//排除特殊情况,
if(p[0]=='*'&&p[strlen-1]=='*'){

}
if(p[0]=='*'&&p[strlen-1]=='*'){

}
}

先保存以下大佬的代码,回来在搞一回,就不信了,

class Solution {
public:
    bool isMatch(string s, string p) {
        int m = s.size();
        int n = p.size();
        //dp[i][j]表示从s开头起长度为i的字串和从p开头起长度为j的字串是否匹配
        vector<vector<bool>> dp(m + 1,vector<bool>(n+1,false));
        //dpf表示从p开头起长度为j的字串是否有过与s匹配
        vector<bool> dpf(n+1,false);  
        dp[0][0] = true;  //空字符和空字符匹配;
        dpf[0] = true;
        
        for(int i = 0 ; i <= m ; ++i){
            for(int j = 1; j <= n; ++j){
                if(p[j-1] == '*'){
                        dp[i][j] = dpf[j-1]; 
                }else if(p[j-1] == '?' ){
                    if( i >= 1)
                        dp[i][j] = dp[i-1][j-1];
                }else {
                    if(i >= 1)
                        dp[i][j] = (dp[i-1][j-1] && s[i-1] == p[j-1]);   
                }
                
                if(dp[i][j])
                    dpf[j] = true;
            }
        } 
        return dp[m][n];
    }
};
发布了37 篇原创文章 · 获赞 1 · 访问量 670

猜你喜欢

转载自blog.csdn.net/zzuzhaohp/article/details/103219947