Decoded String at Index

medium string stack math

Problem

An encoded string is read left to right: a letter is written once, and a digit d repeats everything decoded so far d times. The decoded string can be enormous, so given the encoding s and an index k (1-based), return the k-th character without materializing the decoding.

Inputs = "leet2code3", k = 10
Output"o"
Decoded: "leetleetcodeleetleetcodeleetleetcode"; position 10 is 'o'.

def decode_at_index(s, k):
    size = 0
    for c in s:
        size = size * int(c) if c.isdigit() else size + 1
    for c in reversed(s):
        k %= size
        if k == 0 and c.isalpha():
            return c
        size = size // int(c) if c.isdigit() else size - 1
function decodeAtIndex(s, k) {
  let size = 0;
  for (const c of s)
    size = /\d/.test(c) ? size * (+c) : size + 1;
  for (let i = s.length - 1; i >= 0; i--) {
    const c = s[i];
    k %= size;
    if (k === 0 && /[a-z]/.test(c)) return c;
    size = /\d/.test(c) ? size / (+c) : size - 1;
  }
}
String decodeAtIndex(String s, long k) {
    long size = 0;
    for (char c : s.toCharArray())
        size = Character.isDigit(c) ? size * (c - '0') : size + 1;
    for (int i = s.length() - 1; i >= 0; i--) {
        char c = s.charAt(i);
        k %= size;
        if (k == 0 && Character.isLetter(c)) return String.valueOf(c);
        size = Character.isDigit(c) ? size / (c - '0') : size - 1;
    }
    return "";
}
string decodeAtIndex(string s, long long k) {
    long long size = 0;
    for (char c : s)
        size = isdigit(c) ? size * (c - '0') : size + 1;
    for (int i = s.size() - 1; i >= 0; i--) {
        char c = s[i];
        k %= size;
        if (k == 0 && isalpha(c)) return string(1, c);
        size = isdigit(c) ? size / (c - '0') : size - 1;
    }
    return "";
}
Time: O(n) Space: O(1)