展开分解成重复嵌套组件的字符串[关闭]

Posted

技术标签:

【中文标题】展开分解成重复嵌套组件的字符串[关闭]【英文标题】:Expand string broken up into repeated, nested components [closed] 【发布时间】:2021-11-28 03:22:22 【问题描述】:

我正在解决一个问题,给定一个字符串,括号中的子字符串后跟大括号中的值,字符串通过重复子字符串的次数来扩展。所以如果你有 (ab(d)3)2 你会得到 abdddabddd。

我觉得我在正确的轨道上,但 1. 这效率很低, 2. 测试似乎没有返回。希望得到一些帮助!

public class ExpandedString 
    public static String expandedString(String inputStr) 
        while (inputStr.contains("(")) 
            for (int i = 0; i < inputStr.length(); i++) 
                //check if there's something to repeat
                if (inputStr.charAt(i) == '') 
                    int temp = i;
                    //find what you need to repeat
                    while (inputStr.charAt(temp) != '(') 
                        temp--;
                    
                    String inputStr2 = inputStr.substring(i);
                    int numTimes = i + inputStr.indexOf("");
                    //replace (blah) with blah times repeated numTimes
                    StringBuilder repeated = new StringBuilder(); 
                    for(int j = 0; j<numTimes;j++) 
                        repeated.append(inputStr.substring(temp + 1, i - 1));
                    
                    inputStr.replace(inputStr.substring(temp, i), repeated.toString());
                    //start again
                    i = 0;
                
            
        
        return inputStr;
    

    public static void main(String[] args) 
        Scanner in = new Scanner(System.in);

        // input for inputStr
        String inputStr = in .nextLine();

        String result = expandedString(inputStr);
        System.out.print(result);

    

【问题讨论】:

请添加失败的测试用例预期输出、实际输出和调试信息。 【参考方案1】:

这是一个使用 StringBuilder 堆栈和当前 StringBuilder 的解决方案。

当读取( 时,当前的StringBuilder 被压入堆栈并创建一个新的StringBuilder。

读取)时,会提取乘数mul,并将当前StringBuilder的值追加mul次到从栈中弹出的StringBuilder中。

否则,将 char 附加到当前 StringBuilder。

import java.util.Stack;

public class Expand

    public static String expand(String pattern)
    
        StringBuilder sb = new StringBuilder();
        Stack<StringBuilder> stack = new Stack<StringBuilder>();
        int len = pattern.length();
        int i = 0;
        while(i<len)
        
            char c = pattern.charAt(i);
            if(c=='(')
            
                stack.push(sb);
                sb = new StringBuilder();
            
            else if(c==')')
            
                String s = sb.toString();
                int k = pattern.indexOf('', i);
                int mul = Integer.parseInt(pattern.substring(i+2, k));
                sb = stack.pop();
                for(int j=0;j<mul;j++)
                    sb.append(s);
                i = k;
            
            else
                sb.append(c);
            i++;
        
        return sb.toString();
    

    public static void main(String[] args) 
    
        System.out.println(expand("(ab(d)3)2"));
    

输出:

abdddabddd

【讨论】:

以上是关于展开分解成重复嵌套组件的字符串[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

展开嵌套的字符串列表并另存为.txt

Shell的展开

字符串的展开题目

JavaScript 查询字符串 [关闭]

JavaScript 查询字符串 [关闭]

JavaScript 查询字符串 [关闭]