preface
This topic is the top 100 high frequency questions of LeetCode
Our community will gradually organize the Swift Algorithm Solutions of Gu Yi (Netflix growth hacker, author of iOS interview, ACE professional fitness coach. Microblog: @ Taoist Gu Yin) into text versions to facilitate everyone's learning and reading.
So far, we have updated 9 issues of LeetCode algorithm. We will keep the update time and progress (released at 9:00 a.m. on Monday, Wednesday and Friday). There is not much content in each issue. We hope you can read it on the way to work and the long-term accumulation will be greatly improved.
Little steps, no even thousands of miles; If you don't accumulate small streams, you can't become a river and sea. Swift community will accompany you forward. If you have any suggestions and comments, please leave a message at the end of the article. We will try our best to meet your needs.
Difficulty level: difficulty
1. Description
Given a string s and a character rule p, please implement a support '.' Matches the regular expression of '*'.
- '.' matches any single character
- '*' matches zero or more preceding elements
The so-called matching is to cover the whole string s, not part of the string.
2. Examples
Example 1
Input: s = "aa" p = "a" Output: false Explanation:"a" Cannot match "aa" The entire string.
Example 2
Input: s = "aa" p = "a*" Output: true Explanation: because '*' Represents the one that can match zero or more preceding elements, The preceding element here is 'a'. Therefore, the string "aa" Can be considered 'a' Again.
Example 3
Input: s = "ab" p = ".*" Output: true Explanation:".*" Indicates that zero or more can be matched('*')Any character('.').
Example 4
Input: s = "aab" p = "c*a*b" Output: true Explanation: because '*' Represents zero or more, here 'c' Is 0, 'a' Be repeated once. So you can match strings "aab".
Example 5
Input: s = "mississippi" p = "mis*is*p*." Output: false
Constraints:
- 1 <= s.length <= 20
- 1 <= p.length <= 30
- s may be empty and contain only lowercase letters from a-z.
- p may be empty and contain only lowercase letters from a-z and characters And *.
- Ensure that every time the character * appears, it is preceded by a valid character
3. Answer
class RegularExpressionMatching { func isMatch(_ s: String, _ p: String) -> Bool { let sChars = Array(s), pChars = Array(p) var dp = Array(repeating: Array(repeating: false, count: pChars.count + 1), count: sChars.count + 1) dp[0][0] = true for i in 0...pChars.count { // jump over "" vs. "x*" case dp[0][i] = i == 0 || i > 1 && dp[0][i - 2] && pChars[i - 1] == "*" } for i in 0...sChars.count { for j in 0...pChars.count { guard j > 0 else { continue } let pCurrent = pChars[j - 1] if pCurrent != "*" { dp[i][j] = i > 0 && dp[i - 1][j - 1] && (pCurrent == "." || pCurrent == sChars[i - 1]) } else { dp[i][j] = dp[i][j - 2] || i > 0 && j > 1 && (sChars[i - 1] == pChars[j - 2] || pChars[j - 2] == ".") && dp[i - 1][j] } } } return dp[sChars.count][pChars.count] } }
- Main idea: classical two-dimensional dynamic programming
- Time complexity: O(mn)
- Space complexity: O(mn)
The warehouse of the algorithm solution: LeetCode-Swift
go to LeetCode practice
Previous review
There are 5 high-frequency questions in the published articles
LeetCode - #1 sum of two numbers
Difficulty level: easy. The frequency of company interview is as follows:
company | frequency |
---|---|
Amazon | ★★★★★★ |
★★★★★ | |
Airbnb | ★★★★★ |
Microsoft | ★★★★★ |
★★★★ |
LeetCode - #2 adding two numbers
Difficulty level: medium. The frequency of company interview is as follows:
company | frequency |
---|---|
Microsoft | ★★★★ |
Amazon | ★★ |
Airbnb | ★★ |
LeetCode - #3 longest unrepeated substring
Difficulty level: medium. The frequency of company interview is as follows:
company | frequency |
---|---|
Amazon | ★★ |
LeetCode - #4 find the middle value of two ordered arrays
Difficulty level: difficulty
LeetCode - #5 find the longest image string
Difficulty level: medium. The frequency of company interview is as follows:
company | frequency |
---|---|
Amazon | ★★ |
Difficulty level: easy, medium, difficult
Company use frequency: 1 ~ 6 ★
About us
We are jointly maintained by Swift enthusiasts. We will share the technical content with Swift actual combat, Swift UI and Swift foundation as the core, and also sort out and collect excellent learning materials.
Later, we will translate a lot of data to our official account. Interested friends can join us.