Leetcode(884)-索引處的解碼字符串


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

思路:一開始的思路,是遍歷字符串,如果是字母,就加到另外一個字符串上,如果是數字,就重復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]);
            }
        }
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM