LeetCode //C - 394. Decode String

394. Decode String

Given an encoded string, return its decoded string.

The encoding rule is: k[encoded_string], where the encoded_string inside the square brackets is being repeated exactly k times. Note that k is guaranteed to be a positive integer.

You may assume that the input string is always valid; there are no extra white spaces, square brackets are well-formed, etc. Furthermore, you may assume that the original data does not contain any digits and that digits are only for those repeat numbers, k. For example, there will not be input like 3a or 2[4].

The test cases are generated so that the length of the output will never exceed 1 0 5 10^5 105.

Example 1:

Input: s = "3[a]2[bc]"
Output: "aaabcbc"

Example 2:

Input: s = "3[a2[c]]"
Output: "accaccacc"

Example 3:

Input: s = "2[abc]3[cd]ef"
Output: "abcabccdcdcdef"

Constraints:
  • 1 <= s.length <= 30
  • s consists of lowercase English letters, digits, and square brackets '[]'.
  • s is guaranteed to be a valid input.
  • ll the integers in s are in the range [1, 300].

From: LeetCode

Link: 394. Decode String


Solution:

Ideas:
  1. Stack Implementation: Since the problem involves nested structures and the need to process the most recent open bracket first, a stack data structure is suitable. We'll use two stacks: one for characters and one for integers.

  2. Parsing the Input String: We iterate through the input string. When we encounter a digit, we calculate the whole number (as numbers can have more than one digit) and push it onto the integer stack. When we encounter a '[', we push a marker onto the character stack. For letters, we simply push them onto the character stack.

  3. Decoding: When we encounter a ']', it means we need to decode the string within the last '[' and ']' encountered. We pop characters from the character stack until we reach the marker, build the string, then multiply it according to the top value of the integer stack, and push the result back onto the character stack.

  4. Building the Result: After processing the entire input string, the character stack will contain the decoded string. We then pop all characters to build the final result.

  5. Memory Management: Since we need to return a dynamically allocated string, we need to ensure proper memory allocation and deallocation to avoid memory leaks.

Code:
c 复制代码
char* decodeString(char* s) {
    int numStack[30], numTop = -1;     // Stack for numbers
    char charStack[30000], *p = s;     // Stack for characters
    int charTop = -1, num = 0;

    while (*p) {
        if (isdigit(*p)) {             // If it's a digit, calculate the number
            num = num * 10 + (*p - '0');
        } else if (*p == '[') {
            numStack[++numTop] = num;  // Push the number onto the numStack
            charStack[++charTop] = '['; // Push a marker onto the charStack
            num = 0;                   // Reset the number for next use
        } else if (*p == ']') {
            int repeat = numStack[numTop--]; // Pop the top number for repetition
            char temp[30000], *tempPtr = temp;
            while (charStack[charTop] != '[') // Build the string to repeat
                *tempPtr++ = charStack[charTop--];
            charTop--;                       // Pop the '[' marker
            while (repeat-- > 0)             // Repeat the string
                for (char* k = tempPtr - 1; k >= temp; k--)
                    charStack[++charTop] = *k;
        } else {
            charStack[++charTop] = *p;      // Push the character onto the stack
        }
        p++;
    }
    
    charStack[++charTop] = '\0';            // Null-terminate the string
    char* result = (char*)malloc(charTop + 1);
    strcpy(result, charStack);              // Copy the stack content to result
    return result;
}
相关推荐
风中的微尘1 小时前
39.网络流入门
开发语言·网络·c++·算法
西红柿维生素2 小时前
JVM相关总结
java·jvm·算法
ChillJavaGuy4 小时前
常见限流算法详解与对比
java·算法·限流算法
sali-tec4 小时前
C# 基于halcon的视觉工作流-章34-环状测量
开发语言·图像处理·算法·计算机视觉·c#
Gu_shiwww4 小时前
数据结构8——双向链表
c语言·数据结构·python·链表·小白初步
你怎么知道我是队长5 小时前
C语言---循环结构
c语言·开发语言·算法
艾醒5 小时前
大模型面试题剖析:RAG中的文本分割策略
人工智能·算法
程序猿编码6 小时前
基于 Linux 内核模块的字符设备 FIFO 驱动设计与实现解析(C/C++代码实现)
linux·c语言·c++·内核模块·fifo·字符设备
纪元A梦7 小时前
贪心算法应用:K-Means++初始化详解
算法·贪心算法·kmeans
_不会dp不改名_8 小时前
leetcode_21 合并两个有序链表
算法·leetcode·链表