zoukankan      html  css  js  c++  java
  • LeetCode 320. Generalized Abbreviation

    原题链接在这里:https://leetcode.com/problems/generalized-abbreviation/

    题目:

    Write a function to generate the generalized abbreviations of a word.

    Example:

    Given word = "word", return the following list (order does not matter):

    ["word", "1ord", "w1rd", "wo1d", "wor1", "2rd", "w2d", "wo2", "1o1d", "1or1", "w1r1", "1o2", "2r1", "3d", "w3", "4"]

    题解:

    For DFS, the state needs word, current index, current string, res and count of abbreviated char.

    对于当前char有两个选择: 第一缩写当前char, count+1, index+1. 第二不缩写当前char, 先append 非零的count再append当前char, count回零, index+1.

    Backtracking时因为直接用string, 都是copy所以不担心.

    Time Complexity: exponential. 在每一步递归时,有两个branches. 递归树全部展开会有2^n个叶子. 每一个叶子都相当于用了O(n)时长, 把StringBuilder变成String就用时O(n). n = word.length().

    Space: O(n). n层stack, char array size也是n. regardless res.

    AC Java:

     1 class Solution {
     2     public List<String> generateAbbreviations(String word) {
     3         List<String> res = new ArrayList<String>();
     4         if(word == null || word.length() == 0){
     5             res.add("");
     6             return res;
     7         }
     8         
     9         dfs(word, 0, 0, "", res);
    10         return res;
    11     }
    12     
    13     private void dfs(String word, int i, int count, String cur, List<String> res){
    14         if(i == word.length()){
    15             if(count != 0){
    16                 cur += count;
    17             }
    18             
    19             res.add(cur);
    20             return;
    21         }
    22         
    23         dfs(word, i+1, count+1, cur, res);
    24         
    25         if(count != 0){
    26             cur += count;
    27         }
    28         
    29         cur += word.charAt(i);
    30         dfs(word, i+1, 0, cur, res);
    31     }
    32 }

    Bit Manipulation 方法是用binary表示word的每一位. 0代表不缩写当前char, 1代表缩写当前char. 

    word 若是用 0011表示就是不缩写wo, 缩写rd, 最后是wo2.

    对于word的所有binary表示, 也就是0000到1111走一遍,每个binary变成string.

    Time Complexity: O(n*2^n). n = word.length(), 一共有O(2^n)个binary表示. 每个binary变成string用时O(n).

    Space: O(n), regardless res.

    AC Java:

     1 public class Solution {
     2     public List<String> generateAbbreviations(String word) {
     3         List<String> res = new ArrayList<String>();
     4         if(word == null){
     5             return res;
     6         }
     7         int n = 1<<word.length();
     8         char [] s = word.toCharArray();
     9         for(int i = 0; i<n; i++){
    10             res.add(abbr(i, s));
    11         }
    12         return res;
    13     }
    14     
    15     private String abbr(int num, char [] s){
    16         StringBuilder sb = new StringBuilder();
    17         int count = 0;
    18         for(int i = 0; i<s.length; i++, num>>=1){
    19             // 0 表示不缩写当前char, 1 表示缩写当前char
    20             if((num & 1) == 0){
    21                 // 先加上之前的非零count, 再把count清零
    22                 if(count != 0){
    23                     sb.append(count);
    24                     count = 0;
    25                 }
    26                 sb.append(s[i]);
    27             }else{
    28                 count++;
    29             }
    30         }
    31         //最后的非零count不要忘记加进sb中
    32         if(count != 0){
    33             sb.append(count);
    34         }
    35         return sb.toString();
    36     }
    37 }
  • 相关阅读:
    Array 对象-sort()
    vue安装
    前端面试题
    JavaScript对象原型
    CSS如何水平垂直居中?
    块格式化上下文(Block Formatting Context,BFC)
    盒子模型
    前端基础
    Markdown语法
    浏览器 滚动条 占据 y轴宽度的解决方案
  • 原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/5297329.html
Copyright © 2011-2022 走看看