Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- func numDecodings(_ s: String) -> Int {
- if s.isEmpty {
- return 0
- }
- let nums = Array(s.utf16).map { Int($0) - 48}
- let star = Int(Array("*".utf16)[0]) - 48
- var dp = [Int](repeating: 0, count: nums.count + 1)
- if nums[0] == 0 {
- // 012 return 0 result
- return 0
- }
- // initialize
- dp[0] = 1
- dp[1] = nums[0] == star ? 9 : 1
- // corner case "*" or "4"
- if nums.count == 1 {
- return dp[1]
- }
- for i in 2...nums.count {
- // first consider single digit at nums[i - 1]
- if nums[i - 1] > 0 && nums[i - 1] < 10 {
- // case normal number: "123"
- dp[i] += dp[i - 1]
- } else if nums[i - 1] == star {
- // * case "12*"
- dp[i] += dp[i - 1] * 9
- }
- // second consider two digits at nums[i - 2], nums[i - 1]
- if nums[i - 1] != star && nums[i - 2] != star {
- //122 check num 10-26 or not
- let num = nums[i - 2] * 10 + nums[i - 1]
- if num >= 10 && num <= 26 {
- dp[i] += dp[i - 2]
- }
- } else if nums[i - 1] == star && nums[i - 2] == star {
- // 1**: 10-26 so 15
- dp[i] += dp[i - 2] * (9 + 6)
- } else if nums[i - 2] != star {
- // 1* and 2* two cases
- if nums[i - 2] == 2 {
- dp[i] += dp[i - 2] * 6
- } else if nums[i - 2] == 1 {
- dp[i] += dp[i - 2] * 9
- }
- } else {
- // *X two case X == 0-6 (10, 20, 11, 21, ..., 16, 26) and X == 7-9 (17, 18, 19)
- if nums[i - 1] < 7 {
- dp[i] += dp[i - 2] * 2
- } else {
- dp[i] += dp[i - 2]
- }
- }
- // I think as swift is dynamic, we don't need to worry about this, but the testcase answers are %1000000007
- // case like "*************" would overflow Int32 if we dont mod 1000000007 in order to pass the testcase result
- dp[i] %= 1000000007
- }
- return dp[nums.count]
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement