当前位置: 首页 > 知识库问答 >
问题:

Java-如何递归解码字符串

乐正远航
2023-03-14

我需要解码一个递归编码为count后跟substring的字符串

给定一个编码字符串,任务是对其进行解码。字符串的编码模式如下所示。

示例:

输入:str[]=“1[b]”输出:b

输入:str[]="2[ab]输出:abab

输入:str[]=“2[a2[b]”输出:ABB

输入:str[]="3[b2[ca]]"输出:bcacabcacabcaca

下面是我试图实现的代码。我只知道它可以用两个堆栈来解决。

public class Main {
    public static void main(String[] args) {
        Stack<Interger> s1 = new Stack();
        Stack<String> s2 = new Stack();
        String result = "";
        for(int i = 0; i < args.length; i++){
            if(Interger.parseInt(args[i]) == 0){
                s1.push(args[i]);
            }
            if(args[i] == 0){
                if(args[i] == ']'){
                   result = s2.pop();
                }
                if(args[i] == '['){
                    continue;
                }
                s2.push(args[i])
            }
        }
    }
}

有人能帮我写代码以获得预期输出的有效方法是什么吗?

共有2个答案

陶烨赫
2023-03-14

如何递归解码字符串

您需要定义基本情况和递归情况:

>

递归大小写-我们需要确定开始[和结束括号]的索引,并基于该合约创建一个新字符串。

这就是它的实现方式:

public static String decode(String str) {
    int startOfBrackets = str.indexOf('[');
    
    if (startOfBrackets == -1) { // base case there's no square brackets in the string
        return str;
    }

    int startOfDigits = getFirstDigitsPosition(str);
    int repeatNum = Integer.parseInt(str.substring(startOfDigits, startOfBrackets));
    
    return str.substring(0, startOfDigits) +
        decode(str.substring(startOfBrackets + 1, str.length() - 1)).repeat(repeatNum);
}

public static final Pattern SINGLE_DIGIT = Pattern.compile("\\d");

public static int getFirstDigitsPosition(String str) {
    Matcher matcher = SINGLE_DIGIT.matcher(str);
    if (matcher.find()) {
        return matcher.start();
    }
    return -1;
}

main()

public static void main(String[] args) {
    System.out.println(decode("1[b]"));
    System.out.println(decode("2[ab]"));
    System.out.println(decode("2[a2[b]]"));
    System.out.println(decode("3[b2[ca]]"));
}

输出:

abab
abbabb
bcacabcacabcaca
程彭祖
2023-03-14

其思想是使用两个堆栈,一个用于整数,另一个用于字符。现在,遍历字符串

  1. 每当我们遇到任何数字时,将其推入整数堆栈,如果是任何字母表(a到z)或开括号 (‘[‘), 将其推入字符堆栈。
  2. 每当遇到任何关闭括号 (‘]’) 时,从字符堆栈中弹出字符,直到在字符堆栈中找不到打开括号 (‘[‘) 。此外,从整数堆栈中弹出顶部元素,例如n。现在创建一个字符串,重复弹出的字符n次。现在,将字符串的所有字符推入堆栈。

下面是这种方法的实现

        import java.util.Stack;
 
      class Test
      {
        // Returns decoded string for 'str'
        static String decode(String str)
        {
        Stack<Integer> integerstack = new Stack<>();
        Stack<Character> stringstack = new Stack<>();
        String temp = "", result = "";
      
        // Traversing the string
        for (int i = 0; i < str.length(); i++)
        {
            int count = 0;
      
            // If number, convert it into number
            // and push it into integerstack.
            if (Character.isDigit(str.charAt(i)))
            {
                while (Character.isDigit(str.charAt(i)))
                {
                    count = count * 10 + str.charAt(i) - '0';
                    i++;
                }
      
                i--;
                integerstack.push(count);
            }
      
            // If closing bracket ']', pop element until
            // '[' opening bracket is not found in the
            // character stack.
            else if (str.charAt(i) == ']')
            {
                temp = "";
                count = 0;
      
                if (!integerstack.isEmpty())
                {
                    count = integerstack.peek();
                    integerstack.pop();
                }
      
                while (!stringstack.isEmpty() && stringstack.peek()!='[' )
                {
                    temp = stringstack.peek() + temp;
                    stringstack.pop();
                }
      
                if (!stringstack.empty() && stringstack.peek() == '[')
                    stringstack.pop();
      
                // Repeating the popped string 'temo' count
                // number of times.
                for (int j = 0; j < count; j++)
                    result = result + temp;
      
                // Push it in the character stack.
                for (int j = 0; j < result.length(); j++)
                    stringstack.push(result.charAt(j));
      
                result = "";
            }
      
            // If '[' opening bracket, push it into character stack.
            else if (str.charAt(i) == '[')
            {
                if (Character.isDigit(str.charAt(i-1)))
                    stringstack.push(str.charAt(i));
      
                else
                {
                    stringstack.push(str.charAt(i));
                    integerstack.push(1);
                }
            }
      
            else
                stringstack.push(str.charAt(i));
        }
      
        // Pop all the element, make a string and return.
        while (!stringstack.isEmpty())
        {
            result = stringstack.peek() + result;
            stringstack.pop();
        }
      
        return result;
    }
 
    // Driver method
    public static void main(String args[])
    {
        String str = "3[b2[ca]]";
        System.out.println(decode(str));
     } 
    }

输出:BCACABCABCACA

 类似资料:
  • 本文向大家介绍Java字符串无意识的递归过程解析,包括了Java字符串无意识的递归过程解析的使用技巧和注意事项,需要的朋友参考一下 Java中的每个类基本上都继承自Object,标准容器类自然也不例外。因此容器类都有toString()方法,并且重写了该方法,使得它生成的String结果能够表达容器本身,以及容器所包含的对象。 例如ArrayList.toString(),它会遍历ArrayLis

  • 本文向大家介绍java递归法求字符串逆序,包括了java递归法求字符串逆序的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了java递归法求字符串逆序的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的java程序设计有所帮助。

  • 问题内容: 您如何使用递归方法编写一个Java程序,该方法将一个int像“ 234”那样接受并将其转换为电话键盘上的相应字母(2 = ABC,3 = DEF等),并打印出此字符的排列?例如: 输入= 234 输出= ADG ADH ADI AEG AEH AEI AFG AFH AFI BDG BDH BDI BEG BEH BEI BFG BFH BFI CDG CDH CDI CEG CEH

  • 问题内容: 我有一些我想解码的代码,但是如果正在使用任何代码页,猜测代码页的运气就不会很幸运。任何帮助将非常感激。 这是代码: 问题答案: 需要注意的是,如指出的评论,如果你只是想看到生成的脚本可以更换第二用,例如从那么回事: 至: 并运行结果。如果你想了解多一点关于 如何 它的工作原理,见下图。 您有两个输入,一个输入只是用管道分隔的数据(),另一个是基于该数据的以base 64()编码的程序的

  • 问题内容: 大家!我可以请您帮我解码以下JSON代码: 我想将上述结构组织为: 注1: 文件夹:收件箱 来自(来自):… 日期(日期):… 时间(时间):… utcOffsetSeconds:… 收件人(地址):… 收件人(姓名):… 状态(deliveryStatus):… 文字(正文):… 笔记2: … 先感谢您! 问题答案: 您可以使用该函数来解码JSON字符串: 而且您会得到像这样的东西:

  • 我有一个用mvn Exec:java运行的程序(我的主文件是用utf-8编码的,系统的默认字符集是windows-1252) 我不明白为什么第一次打印工作,根据文档getBytes使用给定的字符集将字符串编码成字节序列,字符串构造函数通过使用平台的默认字符集解码指定的字节数组来构造新的字符串