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 }
  • 相关阅读:
    centos7.6 使用yum安装mysql5.7
    解决hadoop本地库问题
    docker-compose 启动警告
    docker 安装zabbix5.0 界面乱码问题解决
    docker 部署zabbix问题
    zookeeper 超时问题
    hbase regionserver异常宕机
    (转载)hadoop 滚动升级
    hadoop Requested data length 86483783 is longer than maximum configured RPC length
    zkfc 异常退出问题,报错Received stat error from Zookeeper. code:CONNECTIONLOSS
  • 原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/5297329.html
Copyright © 2011-2022 走看看