繁体   English   中英

解码 Java 中的字符串

[英]Decode String in Java

我正在尝试将此 Python 解决方案转换为 Java。出于某种原因,我的 Java 解决方案无法正常工作。 如何正确地做到这一点?

https://leetcode.com/problems/decode-string/description/


给定一个编码字符串,返回它的解码字符串。 编码规则为:k[encoded_string],其中方括号内的encoded_string正好重复k次。 请注意,k 保证为正数 integer。

您可能会假设输入字符串始终有效; 没有多余的空格,方括号格式正确等。此外,您可以假设原始数据不包含任何数字,并且数字仅用于那些重复数字 k。 例如,不会有像 3a 或 2[4] 这样的输入。

生成测试用例,使 output 的长度永远不会超过 105。

Example 1:

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

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

Python 解决办法:

class 解决方案:def decodeString(self, s: str) -> str: stack = []

    for char in s:
        if char is not "]":
            stack.append(char)
        else:
            sub_str = ""
            while stack[-1] is not "[":
                sub_str = stack.pop() + sub_str
            stack.pop()

            multiplier = ""
            while stack and stack[-1].isdigit():
                multiplier = stack.pop() + multiplier

            stack.append(int(multiplier) * sub_str)

    return "".join(stack)

Java 尝试:

class Solution {
    public String decodeString(String s) {
        Deque<String> list = new ArrayDeque<String>();
        String subword = "";
        String number = "";

        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) != ']' ) {
                list.add(String.valueOf(s.charAt(i)));
            }
            else {
                subword = "";
                while (list.size() > 0 && !list.getLast().equals("[") ) {
                    subword = list.pop() + subword;
                }
                if (list.size() > 0) list.pop();

                number = "";
                while (list.size() > 0 && isNumeric(list.getLast())){
                    number = list.pop() + number;
                }
                for (int j = 1; (isNumeric(number) && j <= Integer.parseInt(number)); j++) list.add(subword);   

            }
        }
        return String.join("", list);
    }

    public static boolean isNumeric(String str) { 
        try {  
            Double.parseDouble(str);  
            return true;
        } catch(NumberFormatException e){  
            return false;  
        }  
    }   
}

您发布的代码不起作用的原因是 python 中的 pop() 方法默认删除最后一个元素。

在此处输入图像描述

但是在 Java 中,ArrayDeque 类的 pop() 方法删除了第一个元素。

在此处输入图像描述

为了使用 ArrayDeque 模拟 python 代码,您需要改用 ArrayDeque 实例的removeLast()方法。

public class Solution{
    public static String decodeString(String s) {
        StringBuilder stack = new StringBuilder();
        for(char c : s.toCharArray()) {
            if(c != ']') {
                stack.append(c);
            } else {
                StringBuilder sub_str = new StringBuilder();
                while(stack.charAt(stack.length() - 1) != '[') {
                    sub_str.insert(0, stack.charAt(stack.length() - 1));
                    stack.deleteCharAt(stack.length() - 1);
                }
                stack.deleteCharAt(stack.length() - 1);

                StringBuilder multiplier = new StringBuilder();
                while(stack.length() > 0 && Character.isDigit(stack.charAt(stack.length() - 1))) {
                    multiplier.insert(0, stack.charAt(stack.length() - 1));
                    stack.deleteCharAt(stack.length() - 1);
                }

                for(int i = 0; i < Integer.parseInt(multiplier.toString()); i++) {
                    stack.append(sub_str);
                }
            }
        }
        return stack.toString();
    }

    public static void main(String[] args) {
        System.out.println( decodeString("3[a2[c]]"));
        //Output: "accaccacc"
        System.out.println( decodeString("3[a]2[bc]"));
        //Output: "aaabcbc"
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM