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