Algorithm


Problem Name: 880. Decoded String at Index

You are given an encoded string s. To decode the string to a tape, the encoded string is read one character at a time and the following steps are taken:

  • If the character read is a letter, that letter is written onto the tape.
  • If the character read is a digit d, the entire current tape is repeatedly written d - 1 more times in total.

Given an integer k, return the kth letter (1-indexed) in the decoded string.

 

Example 1:

Input: s = "leet2code3", k = 10
Output: "o"
Explanation: The decoded string is "leetleetcodeleetleetcodeleetleetcode".
The 10th letter in the string is "o".

Example 2:

Input: s = "ha22", k = 5
Output: "h"
Explanation: The decoded string is "hahahaha".
The 5th letter is "h".

Example 3:

Input: s = "a2345678999999999999999", k = 1
Output: "a"
Explanation: The decoded string is "a" repeated 8301530446056247680 times.
The 1st letter is "a".

 

Constraints:

  • 2 <= s.length <= 100
  • s consists of lowercase English letters and digits 2 through 9.
  • s starts with a letter.
  • 1 <= k <= 109
  • It is guaranteed that k is less than or equal to the length of the decoded string.
  • The decoded string is guaranteed to have less than 263 letters.

Code Examples

#1 Code Example with Javascript Programming

Code - Javascript Programming


const decodeAtIndex = function(S, K) {
  let n = S.length;
  let dp = Array(n + 1).fill(0);
  for (let i = 0; i  <  n; i++) {
    if (S[i] >= "2" && S[i] <= "9") {
      dp[i + 1] = dp[i] * (S[i] - "0");
    } else {
      dp[i + 1] = dp[i] + 1;
    }
  }
  K--;
  for (let i = n - 1; i >= 0; i--) {
    K %= dp[i + 1];
    if (K + 1 == dp[i + 1] && !(S[i] >= "2" && S[i]  < = "9")) {
      return "" + S[i];
    }
  }
  return null;
};
Copy The Code & Try With Live Editor

Input

x
+
cmd
s = "leet2code3", k = 10

Output

x
+
cmd
"o"

#2 Code Example with Python Programming

Code - Python Programming


class Solution:
    def decodeAtIndex(self, S, K):
        stack, l = [], 0
        for c in S:
            l = l + 1 if c.isalpha() else l * int(c)
            stack += c,
            while l >= K:
                while stack[-1].isdigit(): l //= int(stack.pop())
                K = K % l
                if not K: return stack[-1]
                l -= 1
                stack.pop()
Copy The Code & Try With Live Editor

Input

x
+
cmd
s = "leet2code3", k = 10

Output

x
+
cmd
"o"
Advertisements

Demonstration


Previous
#879 Leetcode Profitable Schemes Solution in C, C++, Java, JavaScript, Python, C# Leetcode
Next
#881 Leetcode Boats to Save People Solution in C, C++, Java, JavaScript, Python, C# Leetcode