zoukankan      html  css  js  c++  java
  • LeetCode 1087. Brace Expansion

    原题链接在这里:https://leetcode.com/problems/brace-expansion/

    题目:

    A string S represents a list of words.

    Each letter in the word has 1 or more options.  If there is one option, the letter is represented as is.  If there is more than one option, then curly braces delimit the options.  For example, "{a,b,c}" represents options ["a", "b", "c"].

    For example, "{a,b,c}d{e,f}" represents the list ["ade", "adf", "bde", "bdf", "cde", "cdf"].

    Return all words that can be formed in this manner, in lexicographical order.

    Example 1:

    Input: "{a,b}c{d,e}f"
    Output: ["acdf","acef","bcdf","bcef"]
    

    Example 2:

    Input: "abcd"
    Output: ["abcd"]

    Note:

    1. 1 <= S.length <= 50
    2. There are no nested curly brackets.
    3. All characters inside a pair of consecutive opening and ending curly brackets are different.

    题解:

    If there is curly braces, all the chars in it could be candidate.

    Starting from index 0. Do DFS, DFS state needs orginal string, current index, current StringBuilder and res collection.

    If current index i points to '{', then find next index j points to '}', for each of candidate inside brances, append it to StringBuilder and continue DFS at index j+1. After DFS, do backtracking.

    If current index i points to char, append it to StringBuilder and continue DFS at index i+1. After DFS, do bracktracking.

    When current index points to the end of string, add copy of StringBuilder to res collection.

    Time Complexity: exponential.

    Space: O(n). n = S.length(). stack space.

    AC Java:

     1 class Solution {
     2     public String[] expand(String S) {
     3         if(S == null || S.length() == 0){
     4             return new String[0];
     5         }
     6         
     7         List<String> res = new ArrayList<String>();
     8         dfs(S, 0, new StringBuilder(), res);
     9         Collections.sort(res);
    10         return res.toArray(new String[0]);
    11     }
    12     
    13     private void dfs(String s, int i, StringBuilder sb, List<String> res){
    14         if(i >= s.length()){
    15             res.add(sb.toString());
    16             return;
    17         }
    18         
    19         
    20         if(s.charAt(i) == '{'){
    21             int j = i+1;
    22             while(j<s.length() && s.charAt(j)!='}'){
    23                 j++;
    24             }
    25             
    26             String [] candidates = s.substring(i+1, j).split(",");
    27             for(String candidate : candidates){
    28                 sb.append(candidate);
    29                 dfs(s, j+1, sb, res);
    30                 sb.deleteCharAt(sb.length()-1);
    31             }
    32         }else{
    33             sb.append(s.charAt(i));
    34             dfs(s, i+1, sb, res);
    35             sb.deleteCharAt(sb.length()-1);
    36         }
    37     }
    38 }

    类似Decode String.

  • 相关阅读:
    【自动化测试不求人】selenium三种等待时间
    Linux中vim的简单配置
    linux中解压缩并安装.tar.gz后缀的文件
    Linux命令全称
    Linux中的find(-atime、-ctime、-mtime)指令分析
    (转)docker安装Mysql8.0并挂载外部配置和数据
    自动化测试常见Python算法题&答案
    2019年的面试经验总结-软件测试
    Python基础语法
    抓包工具Charles的使用说明
  • 原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/11791503.html
Copyright © 2011-2022 走看看