【问题标题】: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);

    }
}

【问题讨论】:

  • 请添加失败的测试用例预期输出、实际输出和调试信息。

标签: java string algorithm


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多