880. 索引處的解碼字符串

給定一個編碼字符串 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"。

 

提示:

  1. 2 <= S.length <= 100
  2. S 只包含小寫字母與數字 2 到 9 。
  3. S 以字母開頭。
  4. 1 <= K <= 10^9
  5. 解碼後的字符串保證少於 2^63 個字母。

Review:

方法:逆向工作法

思路

如果我們有一個像 appleappleappleappleappleapple 這樣的解碼字符串和一個像 K=24 這樣的索引,那麼如果 K=4,答案是相同的。

一般來說,當解碼的字符串等於某個長度爲 size 的單詞重複某些次數(例如 apple 與 size=5 組合重複6次)時,索引 K 的答案與索引 K % size 的答案相同。

我們可以通過逆向工作,跟蹤解碼字符串的大小來使用這種洞察力。每當解碼的字符串等於某些單詞 word 重複 d 次時,我們就可以將 k 減少到 K % (Word.Length)

算法

首先,找出解碼字符串的長度。之後,我們將逆向工作,跟蹤 size:解析符號 S[0], S[1], ..., S[i]後解碼字符串的長度。

如果我們看到一個數字 S [i],則表示在解析 S [0],S [1],...,S [i-1] 之後解碼字符串的大小將是 size / Integer(S[i])。 否則,將是 size - 1


Code:

    class Solution {
        public String decodeAtIndex(String S, int K) {
            char[] chars = S.toCharArray();
            int len = 0, rec = -1;
            for (int i = 0; i < chars.length; i++) {
                if (chars[i] > 64) {
                    len++;
                } else {
                    len *= chars[i] - 48;
                }
                if (len >= K) {
                    rec = i;
                    break;
                }
            }
            // 倒序
            for (int i = rec; i > -1; i--) {
                K%=len;
                if (chars[i] > 64 && K==0) {
                    return "" + chars[i];
                } else if(chars[i] < 64){
                    len /= chars[i] - 48;
                }else{
                    len--;
                }
            }
            return "";
        }
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章