An encoded string S
is given. To find and write the decoded 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 (say
d
), the entire current tape is repeatedly writtend-1
more times in total.
Now for some encoded string S
, and an index K
, find and return the K
-th 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".
Note:
2 <= S.length <= 100
S
will only contain lowercase letters and digits2
through9
.S
starts with a letter.1 <= K <= 10^9
- The decoded string is guaranteed to have less than
2^63
letters.
处理到不好处理的时候,就递归一下
class Solution:
def decodeAtIndex(self, S, K):
"""
:type S: str
:type K: int
:rtype: str
"""
s=set([str(i) for i in range(2,10)])
i=cnt=0
while i<len(S):
j=i
while j<len(S) and S[j] not in s:
j+=1
cnt+=1
if cnt==K: return S[j-1]
while j<len(S) and S[j] in s:
if cnt*int(S[j])>=K:
left = K%cnt
if left==0: left=cnt
return self.decodeAtIndex(S[:j], left)
cnt = cnt*int(S[j])
j+=1
i=j
return None
Discuss里有很简单的写法:先往右扩,扩到超过K,然后往回退
idea真的很simple,但是确实有效,其实就是个stack,看到题目应该要能想到能用stack来解的
We decode the string and N
keeps the length of decoded string, until N >= K
.
Then we go back from the decoding position.
If it's S[i] = d
is a digit, then N = N / d
before repeat and K = K % N
is what we want.
If it's S[i] = c
is a character, we return c
if K == 0
or K == N
def decodeAtIndex(self, S, K):
N = 0
for i, c in enumerate(S):
N = N * int(c) if c.isdigit() else N + 1
if K <= N: break
for j in range(i, -1, -1):
c = S[j]
if c.isdigit():
N /= int(c)
K %= N
else:
if K == N or K == 0: return c
N -= 1