給定一個編碼字符串 S
。為了找出解碼字符串並將其寫入磁帶,從編碼字符串中每次讀取一個字符
,並采取以下步驟:
- 如果所讀的字符是字母,則將該字母寫在磁帶上。
- 如果所讀的字符是數字(例如
d
),則整個當前磁帶總共會被重復寫d-1
次。
現在,對於給定的編碼字符串 S
和索引 K
,查找並返回解碼字符串中的第 K
個字母。
示例 1:
輸入:S = "leet2code3", K = 10 輸出:"o" 解釋: 解碼后的字符串為 "leetleetcodeleetleetcodeleetleetcode"。 字符串中的第 10 個字母是 "o"。
示例 2:
輸入:S = "ha22", K = 5 輸出:"h" 解釋: 解碼后的字符串為 "hahahaha"。第 5 個字母是 "h"。
示例 3:
輸入:S = "a2345678999999999999999", K = 1 輸出:"a" 解釋: 解碼后的字符串為 "a" 重復 8301530446056247680 次。第 1 個字母是 "a"。
提示:
2 <= S.length <= 100
S
只包含小寫字母與數字2
到9
。S
以字母開頭。1 <= K <= 10^9
- 解碼后的字符串保證少於
2^63
個字母。
思路:一開始的思路,是遍歷字符串,如果是字母,就加到另外一個字符串上,如果是數字,就重復n-1次,當個數大於K時,就返回第K個字符,但是這種做法超時。這也應該是為什么難度是中等的原因吧。
上述的做法,還是要一個個遍歷一個個的加字符,復雜度可想而知,無法滿足題目的要求。
所以我們只能從下標考慮,就是我只記錄我的索引,不涉及真正的字符串的空間,因為字符的操作是有規律的,只要找到其中的規律,我們就可以只通過索引來確定最終字符串的某個字符。
首先我們也是要一個個遍歷,如果是字母,就將索引+1,如果碰到數字,就將這個索引乘以這個數字,當然同時要判斷,索引與K的關系。如果索引小於K,就一直遍歷下去,如果大於等於K,那么就不用了,這個時候我們可以找到第K個元素了。
這個時候要將索引往回退,如果是數字,就要除以這個數字,變成單倍數的字符串,相應的,第K個也要變成單倍數的
string decodeAtIndex(string S, int K) { long cur=0; int i; for(i=0;cur<K;++i) { if(isdigit(S[i])) cur=cur*(S[i]-'0'); else cur++; } while(i--) { if(isdigit(S[i])) { cur=cur/(S[i]-'0'); K=K%cur; } else if(K%(cur--)==0) { return string(1,S[i]); } } }