1. 程式人生 > 其它 >LeetCode 880. 索引處的解碼字串(找規律)

LeetCode 880. 索引處的解碼字串(找規律)

技術標籤:LeetCode

文章目錄

1. 題目

給定一個編碼字串 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 只包含小寫字母與數字 29 。 S 以字母開頭。 1 <= K <= 10^9 題目保證 K 小於或等於解碼字串的長度。 解碼後的字串保證少於 2^63 個字母。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/decoded-string-at-index
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

2. 解題

  • 暴力模擬的方法不可取,字串會很長,會超時
  • 先計算整個目標串的長度 len,到達K長度後,往回反向遍歷
  • 對 K 對 len 取 %,K取%後為 0 且 當前位置為 字母時,返回答案
class Solution {
public:
    string decodeAtIndex(string S, int K) {
        long long count = 0, n = S.size(), i = 0;
        for( ; i < n; ++i)
        {
            if(isalpha(S[i]))
                count++;
            else
                count *= S[i]-'0';
            if(count >= K)
                break;
        }
        for( ; i >= 0; --i)
        {
            K = K%count;
            if(K==0 && isalpha(S[i]))
                return string(1, S[i]);
            if(isalpha(S[i]))
                count--;
            else
                count /= S[i]-'0';
        }
        return "";
    }
};

0 ms 6.3 MB C++


我的CSDN部落格地址 https://michael.blog.csdn.net/

長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!
Michael阿明