题解 | #通配符匹配#

通配符匹配

http://www.nowcoder.com/practice/e96f1a44d4e44d9ab6289ee080099322

解题思路:=======>动态规划

1、定义状态:f[i][j]表示字符串s中以i结尾的子串和字符串p中以j结尾的子串是否匹配。

2、状态转移:

如果p[j]=='?'则需要f[i-1][j-1]&&s[i]为任意字符即可

如果p[j]=='字符,则需要f[i-1][j-1]&&s[i]==p[j]

如果p[j]=='*',则f[i][j]=f[i][j-1]||f[i-1][j-1]||f[i-2][j-1].....||f[i-k][j-1] f[i-1][j]=f[i-1][j-1]||f[i-2][j-1]||f[i-3][j-1]....||f[i-k-1][j-1] ===》优化:f[i][j]=f[i-1][j]||f[i][j-1];

public class Solution {
    public boolean isMatch(String s, String p) {
        int n=s.length();
        int m=p.length();
        String ss=" "+s;
        String pp=" "+p;
        char[]S=ss.toCharArray();
        char[]P=pp.toCharArray();
        boolean[][]f=new boolean[n+1][m+1];//定义状态
        f[0][0]=true;//初始f[0][0]
        for(int i=0;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(P[j]=='*'){
                    f[i][j]=(i-1>=0&&f[i-1][j])||f[i][j-1];
                }
                else{
                    f[i][j]=(i-1>=0&&f[i-1][j-1])&&(P[j]==S[i] || P[j]=='?' );
                }
            }
        }
        return f[n][m];
    }
}
全部评论

相关推荐

找到实习就改名4月17日下午更改:1600一个月?
点赞 评论 收藏
分享
大猪蹄子哥:1-谁教你这么写教育经历的……咱都这个学历了,很多公司要看本科、硕士,Gap Year的,你啪就给一个上大26届硕士,没了。 2-那堆奖学金揉成一行放最后得了,放前面显得你没技术自信,还是那句话,对于咱这个学历直接上重点,你这上半段看起来像个大专(无恶意 3-专业技能最好点出来细化方向,你熟悉的以太网是UDP还是TCP,是千兆还是万兆等等,多种信号处理……那你倒是说两个啊,后面空着干嘛,会的干嘛不讲 4-项目经历废话太多,描述不专业(怎么还有我,我们这种词),没有数据支撑(是婴儿还是巨人看不出来)。最后如果这些是真的XX项目、比赛,最好点出来,不然更显得像自学着玩的,或者说抄的(经典复现等于我做过 5-个人总结在咱这个分段没用
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务