中级农民
- 积分
- 101
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2014-10-16
- 最后登录
- 1970-1-1
|
支持嵌套的Java版本
维护一个list记录已有的options, 比如a{1,2} 处理完的时候list是[a1,a2]
每次遇到bracket时候 recursive call 返回新的list, 两个list合并后size是a*b
最后join list ","
写完感觉代码可读性一般,求建议
顺便求大米
- import java.io.*;
- import java.util.*;
- public class ParseString{
- public static void main(String[] args){
- ParseString solution = new ParseString();
- System.out.println("Input:" + "a{1,2}b{3,4}c{5,6}" + " Result:" + solution.parseString("a{1,2}b{3,4}c{5,6}"));
- System.out.println("Input:" + "{a,b}.txt" + " Result:" + solution.parseString("{a,b}.txt"));
- System.out.println("Input:" + "a.java,b.py,c{.java,.py}" + " Result:" + solution.parseString("a.java,b.py,c{.java,.py}"));
- System.out.println("Input:" + "a{1,2}b{d{7,8},4}c{5,6}" + " Result:" + solution.parseString("a{1,2}b{d{7,8},4}c{5,6}"));
- }
-
- public String parseString(String str){
- Queue<Character> queue = new LinkedList<>();
- for(char c: str.toCharArray()){
- queue.offer(c);
- }
- List<String> res = parseBracket(queue);
- return String.join(",", res);
- }
-
- public List<String> parseBracket(Queue<Character> queue){
- List<String> res = new ArrayList<>();
- StringBuilder sb = new StringBuilder();
- List<String> currentOptions = new ArrayList<>();
- currentOptions.add("");
- while(!queue.isEmpty()){
- Character c = queue.poll();
- if(c.equals('{')){
- String currentString = sb.toString();
- sb = new StringBuilder();
- List<String> nextOptions = parseBracket(queue); // Recursive
- List<String> next = new ArrayList<>();
- for(String previous : currentOptions){
- for(String option : nextOptions){
- next.add(previous + currentString + option);
- }
- }
- currentOptions = next;
- }else if(c.equals('}') || c.equals(',')){
- res.add(finishCurrentOption(sb, currentOptions));
- sb = new StringBuilder();
- currentOptions = new ArrayList<>();
- currentOptions.add("");
- if(c.equals('}')) return res;
- }else{
- sb.append(c);
- }
- }
- res.add(finishCurrentOption(sb, currentOptions));
- return res;
- }
-
- private String finishCurrentOption(StringBuilder sb, List<String> currentOptions){
- String currentString = sb.toString();
- sb = new StringBuilder();
- for(int i=0; i<currentOptions.size(); i++){
- sb.append(currentOptions.get(i));
- sb.append(currentString);
- if(i != currentOptions.size()-1) sb.append(',');
- }
- return sb.toString();
- }
- }
复制代码
补充内容 (2019-4-14 04:40):
log:
Input:{a,b}.txt Result:a.txt,b.txt
Input:a.java,b.py,c{.java,.py} Result:a.java,b.py,c.java,c.py
Input:a{1,2}b{d{7,8},4}c{5,6} Result:a1bd7,d8c5,a1bd7,d8c6,a1b4c5,a1b4c6,a2bd7,d8c5,a2bd7,d8c6,... |
|