leetcode44。ワイルドカード一致は、文字列を説明するのは難しい問題ではありませんDP

「?」文字列(複数可)と文字モード(P)、の実現をサポートするため与えられ、「*」ワイルドカード一致します。

「?」は任意の1文字に一致します。
「*」(空の文字列を含む)任意の文字列にマッチします。
2つの文字列が完全一致が成功したとみなされ一致します。

説明:

sが空であってもよく、小文字のみからAZ。
pは空であると小文字のみAZからの手紙、および文字?および*を含んでいてもよいです。
例1:

入力:
S = "AA"
P = "A"
出力:偽
の解釈: ""文字列全体"AA"に一致することはできません。
例2:

入力:
S = "AA"
Pは= "*"
出力:真の
解釈は: '*'は任意の文字列に一致します。
例3:

入力:
S = "CB"
P = "?A"
出力:偽
の解釈: '?'マッチ'C'が、2番目の'' 'b'が一致していません。
例4:

入力:
S = "adceb"
P = "A * B *"
出力:真の
説明:最初に'*'空の文字列を一致させることができ、第二の'*'は、文字列"DCE"と一致する。
実施例5:

入力:
S = "acdcb"
P = "A B C *?"
入力:偽

アイデア:とleetcode10ほとんどが、これは*任意の文字を表し、文字の前に、それは問題で、DP式の良いプッシュ多くないことができます。

class Solution {
    public boolean isMatch(String s,String p){
        if (s == null || p == null)return false;
        int sLen=s.length();
        int pLen=p.length();
        boolean[][] dp = new boolean[sLen + 1][pLen + 1];
        dp[0][0] = true;//dp[i][j] 表示 s 的前 i 个是否能被 p 的前 j 个匹配
        for (int j=1;j<=pLen;j++)dp[0][j]=p.charAt(j-1)=='*' && dp[0][j-1];
        for (int i = 0; i < sLen; i++) {
            for (int j = 0; j < pLen; j++) {
                //单个字符可以匹配
                if (p.charAt(j) == '?' || p.charAt(j) == s.charAt(i)) dp[i + 1][j + 1] = dp[i][j];
                //多个字符
                if (p.charAt(j) == '*') {
                    dp[i+1][j+1]=dp[i+1][j] || //*代表0个
                    dp[i][j+1]; //代表多个
                    }
                }
            }
            return dp[sLen][pLen];
        }
}

 

公開された595元の記事 ウォンの賞賛10000 + ビュー139万+

おすすめ

転載: blog.csdn.net/hebtu666/article/details/104403686