【Leetcode】880. Decoded String at Index

该文介绍了一道LeetCode的编程题,涉及字符串解码问题。给定一个含有字母和数字的编码字符串,需要找出解码后字符串的第k个字符。通过从后向前遍历,递归地解码并计算每个阶段的字符串长度,最终找到目标字符。时间复杂度为O(n),空间复杂度为O(1)。
摘要由CSDN通过智能技术生成

题目地址:

https://leetcode.com/problems/decoded-string-at-index/description/

给定一个长 n n n的编码过的字符串 s s s,其只含英文小写字母和 2 ∼ 9 2\sim 9 29的数字,其还原方式如下:读到字符则记录,读到数字 c c c则将记录好的字符串重复 c c c遍。问还原后的字符串的第 k k k个字符是什么。题目保证 s s s以字母开头,且 k k k一定有效。计数从 1 1 1开始。

先求还原后的总长度 m m m,然后我们一步步“加密”回来寻找答案,加密的过程即为从后向前遍历 s s s的过程,也是递归的思想。从后向前遍历 s s s,如果遇到数字 c c c,则说明加密一次后字符串变为了 m / c m/c m/c,并且第 k k k个字符即为加密后的第 k m o d    ( m / c ) k\mod (m/c) kmod(m/c)个字符(如果余数是 0 0 0则说明是最后一个字符),所以我们考虑加密 1 1 1次后的新字符串,其长度即为 m / c m/c m/c,我们要求新字符串的第 k m o d    ( m / c ) k\mod (m/c) kmod(m/c)个字符(余数是 0 0 0则是最后一个字符);如果遇到的是字符,此时如果 m = k m=k m=k,则当前字符就是我们要找的字符,否则我们考虑少了最后那个字符的新字符串,其长度为 m − 1 m-1 m1,我们还是要找第 k k k个字符。无论怎样,问题的规模都会缩小。代码如下:

class Solution {
 public:
  string decodeAtIndex(string s, int k) {
    long n = 0;
    for (char ch : s) 
      if (isdigit(ch)) n *= ch - '0';
      else n++;
    
    for (int i = s.size() - 1; i >= 0; i--) {
      char ch = s[i];
      if (isdigit(ch)) {
        int x = ch - '0';
        // 我们要在新的长n/x的串里找第k%n个字符 
        n /= x;
        k %= n;
        if (!k) k = n;
      } else {
        if (n == k) return string(1, ch);
        n--;
      }
    }

    return "";
  }
};

时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值