Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Wildcard Matching ใน Python

กำหนดสตริง s และ pattern p รองรับ wildcard: '?' match ตัวอักษรเดียว, '*' match 0 หรือมากกว่าตัวอักษร ต้องตรวจสอบว่า s match p หรือไม่

ตัวอย่าง: s="aa", p="a?" → True; s="aaaaaa", p="a*" → True

ขั้นตอนการแก้ปัญหา (Dynamic Programming)

  • สร้างตาราง dp ขนาด (len(s)+1) x (len(p)+1) เริ่มต้น False
  • dp[0][0] = True
  • เติม dp[0][j] สำหรับ pattern เริ่มต้นด้วย '*'
  • เติม dp[i][j]: ถ้า s[i-1]==p[j-1] หรือ p[j-1]=='?' → dp[i][j] = dp[i-1][j-1]; ถ้า p[j-1]=='*' → dp[i][j] = dp[i-1][j] or dp[i][j-1]

ตัวอย่างโค้ด

class Solution(object):
    def isMatch(self, s, p):
        sl = len(s)
        pl = len(p)
        dp = [[False for _ in range(pl+1)] for _ in range(sl+1)]
        s = " " + s
        p = " " + p
        dp[0][0] = True
        for i in range(1, pl+1):
            if p[i] == '*':
                dp[0][i] = dp[0][i-1]
        for i in range(1, sl+1):
            for j in range(1, pl+1):
                if s[i] == p[j] or p[j] == '?':
                    dp[i][j] = dp[i-1][j-1]
                elif p[j] == '*':
                    dp[i][j] = dp[i-1][j] or dp[i][j-1]
        return dp[sl][pl]

ob = Solution()
print(ob.isMatch("aa", "a?"))
print(ob.isMatch("aaaaaa", "a*"))

อินพุต

"aa", "a?" "aaaaaa", "a*"

เอาต์พุต

True True