91. Decode ways

#include <stdlib.h>
#include <string.h>

int numDecodings(char *s) {
  int n = strlen(s);
  int *dp = calloc(n + 1, sizeof(int));
  dp[0] = 1;
  dp[1] = s[0] != '0' ? 1 : 0;

  for (int i = 2; i <= n; i++) {
    if (s[i - 1] != '0')
      dp[i] += dp[i - 1];

    int two = (s[i - 2] - '0') * 10 + (s[i - 1] - '0');
    if (two >= 10 && two <= 26)
      dp[i] += dp[i - 2];
  }
  int res = dp[n];
  free(dp);
  return res;
}
#include <string>
#include <vector>

using namespace std;

class Solution {
public:
  int numDecodings(string s) {
    int n = s.size();
    vector<int> dp(n + 1, 0);
    dp[0] = 1;
    dp[1] = s[0] != '0' ? 1 : 0;

    for (int i = 2; i <= n; i++) {
      if (s[i - 1] != '0')
        dp[i] += dp[i - 1];

      int two = (s[i - 2] - '0') * 10 + (s[i - 1] - '0');
      if (two >= 10 && two <= 26)
        dp[i] += dp[i - 2];
    }
    return dp[n];
  }
};
package dp

func numDecodings(s string) int {
    n := len(s)
    dp := make([]int, n+1)
    dp[0] = 1
    if s[0] != '0' {
        dp[1] = 1
    }

    for i := 2; i <= n; i++ {
        if s[i-1] != '0' {
            dp[i] += dp[i-1]
        }

        two := int(s[i-2]-'0')*10 + int(s[i-1]-'0')
        if two >= 10 && two <= 26 {
            dp[i] += dp[i-2]
        }
    }
    return dp[n]
}
class Solution {
    public int numDecodings(String s) {
        int n = s.length();
        int[] dp = new int[n + 1];
        dp[0] = 1;
        dp[1] = s.charAt(0) != '0' ? 1 : 0;

        for (int i = 2; i <= n; i++) {
            if (s.charAt(i - 1) != '0')
                dp[i] += dp[i - 1];

            int two = (s.charAt(i - 2) - '0') * 10 + (s.charAt(i - 1) - '0');
            if (two >= 10 && two <= 26)
                dp[i] += dp[i - 2];
        }
        return dp[n];
    }
}
/**
 * @param {string} s
 * @return {number}
 */
var numDecodings = function (s) {
  const n = s.length;
  const dp = new Array(n + 1).fill(0);
  dp[0] = 1;
  dp[1] = s[0] !== '0' ? 1 : 0;

  for (let i = 2; i <= n; i++) {
    if (s[i - 1] !== '0') dp[i] += dp[i - 1];

    const two = Number(s.substring(i - 2, i));
    if (two >= 10 && two <= 26) dp[i] += dp[i - 2];
  }
  return dp[n];
};
class Solution:
    def numDecodings(self, s: str) -> int:
        n = len(s)
        dp = [0] * (n + 1)
        dp[0] = 1
        dp[1] = 1 if s[0] != "0" else 0

        for i in range(2, n + 1):
            if s[i - 1] != "0":
                dp[i] += dp[i - 1]

            two = int(s[i - 2 : i])
            if 10 <= two <= 26:
                dp[i] += dp[i - 2]
        return dp[n]
impl Solution {
    pub fn num_decodings(s: String) -> i32 {
        let b = s.as_bytes();
        let n = b.len();
        let mut dp = vec![0; n + 1];
        dp[0] = 1;
        dp[1] = if b[0] != b'0' { 1 } else { 0 };

        for i in 2..=n {
            if b[i - 1] != b'0' {
                dp[i] += dp[i - 1];
            }

            let two = (b[i - 2] - b'0') * 10 + (b[i - 1] - b'0');
            if (10..=26).contains(&two) {
                dp[i] += dp[i - 2];
            }
        }
        dp[n]
    }
}