Müntəzəm İfadə Uyğunluğu Daimi İfadə Uyğunluğu LeetCode Həlli

Çətinlik səviyyəsi Ağır
Tez-tez soruşulur Çiy kərpic Airbnb Amazon alma Bloomberg Coursera eBay Facebook Goldman Sachs google JPMorgan microsoft Nvidia Paytm Snapchat cuqquldamaq Über YahooBaxılıb 18

Problem bəyanat

Müntəzəm İfadə Uyğunluğu Daimi İfadə Uyğunluğu LeetCode Həlli – Giriş sətri verilmişdir s və bir nümunə p, dəstəyi ilə müntəzəm ifadə uyğunluğunu həyata keçirin '.' və '*' burada:

  • '.' İstənilən tək xarakterə uyğun gəlir.
  • '*' Əvvəlki elementin sıfır və ya daha çoxuna uyğun gəlir.

Uyğunluq əhatə etməlidir bütöv giriş sətri (qismən deyil).

Normal İfadə Uyğunluğu Adi İfadə UyğunluğuPin

misal

Test işi 1:

Input:

s = “aa”

p = “a”

Çıxış:

saxta

Test işi 2:

Input:

s = “aa”

p = “a*”

Çıxış:

doğru

Test işi 3:

Input:

s = "ab"

p = “.*”

Çıxış:

doğru

Explanation:

i) “a” bütün “aa” sətrinə uyğun gəlmir.

ii) '*' əvvəlki elementin sıfır və ya daha çoxunu bildirir, 'a'. Ona görə də “a” hərfini bir dəfə təkrarlamaqla “aa” olur.

iii) “.*” “sıfır və ya daha çox (*) hər hansı simvoldan (.)” deməkdir.

Yanaşma:

s='aab', p='c*a*b'

kabinə

0 1 2 3 4 5

0 var

bir 1

bir 2

b 3

dp[i][j] s.substring(0,i)-nin p nümunəsi üçün etibarlı olub olmadığını bildirir.alt sətir(0,j). Məsələn, dp[0][0] == doğru (y ilə işarələnir matris) çünki s və p hər ikisi boş olduqda uyğun gəlir. Beləliklə, əgər biz bir şəkildə dp[i+1][j+1]-ni əvvəlki dp[i][j]-lərə əsaslandırsaq, nəticə dp[s.length()][p.length()] olacaq.

Bəs birinci sütun haqqında nə demək olar? boş nümunə üçün p=””, etibarlı olan yeganə şey boş sətirdir s=””, və bu artıq bizim dp[0][0]-dır ki, bu doğrudur. Bu o deməkdir ki, `dp[i][0]' qalanı yanlışdır.

s='aab', p='c*a*b'

kabinə

0 1 2 3 4 5

0 var

a 1 n

a 2 n

b 3 n

Bəs birinci sıra? Başqa sözlə, hansı p nümunəsi boş sətir s=”” ilə uyğun gəlir? Cavab ya boş model p=””, ya da p=”a*”, p=”z*” kimi boş sətri təmsil edə bilən nümunə və ya daha maraqlısı p=”a*-da olduğu kimi onların kombinasiyasıdır. b*c*”. Aşağıda for döngüsü dp[0][j]-ni doldurmaq üçün istifadə olunur. dp[0][j-2] yoxlayaraq əvvəlki vəziyyətlərdən necə istifadə etdiyinə diqqət yetirin.

üçün (int j=2; j<=p.length(); j++) {

dp[0][j] = p.charAt(j-1) == '*' && dp[0][j-2];

}

Bu mərhələdə matrisimiz aşağıdakı kimi oldu: Qeyd edək ki, dp[0][2] və dp[0][4] hər ikisi doğrudur, çünki p=”c*” və p=”c*a*” hər ikisi boş olana uyğun gələ bilər. simli.

s='aab', p='c*a*b'

kabinə

0 1 2 3 4 5

0 innin

a 1 n

a 2 n

b 3 n

Beləliklə, indi əsas iterasiyamıza başlaya bilərik. Əsasən eynidir, biz bütün mümkün s uzunluqlarını (i) bütün mümkün p uzunluqları (j) üçün təkrarlayacağıq və əvvəlki nəticələrə əsasən əlaqə tapmağa çalışacağıq. Məlum olub ki, iki hal var.

  1. (p.charAt(j-1) == s.charAt(i-1) || p.charAt(j-1) == '.') cari simvollar uyğun gəlirsə və ya nümunə varsa. onda nəticə əvvəlki vəziyyətlə müəyyən edilir dp[i][j] = dp[i-1][j-1]. -1 ofsetindən istifadə edən charAt(j-1) charAt(i-1) indeksləri ilə çaşdırmayın, çünki bizim dp massivi əslində dp[0 ilkin vəziyyətini saxlamaq üçün bizim sətir və naxış uzunluqlarımızdan bir indeks böyükdür. ][0]
  2. əgər p.charAt(j-1) == '*' onda ya boş çoxluq kimi çıxış edir və nəticə dp[i][j] = dp[i][j-2] və ya (s.charAt(i) olur. -1) == p.charAt(j-2) || p.charAt(j-2) == '.') sətrin cari simvolu nümunədə *-dan əvvəlki simvola bərabərdir, beləliklə nəticə dp[i-1] [j].

Beləliklə, bütün elementləri qiymətləndirdikdən sonra matrisin son vəziyyəti budur:

s='aab', p='c*a*b'

kabinə

0 1 2 3 4 5

0 innin

a 1 nnnyyn

a 2 nnnin

b 3 nnnnny

Normal İfadə Uyğunluğu üçün Kod Adi İfadə Uyğunluğu

Java Proqramı

class Solution {
    public boolean isMatch(String s, String p) {
        if (p == null || p.length() == 0) return (s == null || s.length() == 0);
        
        boolean dp[][] = new boolean[s.length()+1][p.length()+1];
        dp[0][0] = true;
        for (int j=2; j<=p.length(); j++) {
            dp[0][j] = p.charAt(j-1) == '*' && dp[0][j-2]; 
        }
        
        for (int j=1; j<=p.length(); j++) {
            for (int i=1; i<=s.length(); i++) {
                if (p.charAt(j-1) == s.charAt(i-1) || p.charAt(j-1) == '.') 
          dp[i][j] = dp[i-1][j-1];
                else if(p.charAt(j-1) == '*')
                    dp[i][j] = dp[i][j-2] || ((s.charAt(i-1) == p.charAt(j-2) || p.charAt(j-2) == '.') && dp[i-1][j]); 
            }
        }
        return dp[s.length()][p.length()];
    }
}

C ++ Proqramı

class Solution {
public:
    bool isMatch(string s, string p) {
       int m = s.size(), n = p.size();
        vector<vector<bool>> dp(m + 1, vector<bool>(n + 1, false));
        dp[0][0] = true;
        for (int i = 0; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                if (p[j - 1] == '*') {
                    dp[i][j] = dp[i][j - 2] || (i && dp[i - 1][j] && (s[i - 1] == p[j - 2] || p[j - 2] == '.'));
                } else {
                    dp[i][j] = i && dp[i - 1][j - 1] && (s[i - 1] == p[j - 1] || p[j - 1] == '.');
                }
            }
        }
        return dp[m][n]; 
    }
};

Daimi İfadə Uyğunluğu üçün Mürəkkəblik Təhlili Daimi İfadə Uyğunluğu LeetCode Həlli

Zamanın mürəkkəbliyi: O(p.length() * s.length()).

Kosmik Mürəkkəblik: O(p.length() * s.length()).

Translate »