当前位置: 首页 > news >正文

411. Minimum Unique Word Abbreviation--320+408 back tracking

这道题就是320和408两个题目合在一起:

  • https://leetcode.com/problems/valid-word-abbreviation/description/
  • https://leetcode.com/problems/generalized-abbreviation/description/

 

唯一需要注意的是,需要返回最短的长度,而最短的长度中数字只算一个长度,例如  the abbreviation "a32bc" has length = 4, 因为“32”长度算1.

因此定义一个class node, 不仅存放abbreviation 也存放  定义的“长度”,并且在dfs 中容易算出这个长度, 比如dfs 中 遇到 "10" 只需要长度 +1 即可。

code 长的有点恶心了,就是把 320 和 408 的code 合并在了一起而已。

class Solution {
    public String minAbbreviation(String target, String[] dictionary) {
        //"usaandchinaarefriends" [] 过这个case
        if(dictionary == null || dictionary.length ==0) return target.length()+"";
        
        List<String> dic = new ArrayList<>();
        for(String str: dictionary){  //去掉字典里和 target 里长度不同的单词
            if(str.length() == target.length()){
                dic.add(str);
            }
        }
        
        List<Node> result = new ArrayList<>();
        dfs(new StringBuilder(), result, target,0,0);
        
        Collections.sort(result,(o1,o2)->o1.len-o2.len);
       
        //int min_len = Integer.MAX_VALUE;
        //String min_str = "";
        for(Node node: result){
           boolean flag = false;
           for(String word: dic) {
               //System.out.println(node.abbr);
               flag = validWordAbbreviation(word,node.abbr);
               if(flag) break;
           }
           if(!flag){
               return node.abbr;
           }
         
        }
        
        return "";
    }
    
    private void dfs(StringBuilder curResult,List<Node> result, String word, int cur_index,int abbr_len){
        if(curResult.length() == word.length() || cur_index == word.length()){
            result.add(new Node(curResult.toString(), abbr_len));
            return;
        }
       
        int len = curResult.length(); // 每次记录长度
       

        //put the 剩下的可能的长度
        for(int i=1; i<=word.length()-cur_index; i++){ // wrd: cur_index = 0, len =3, 可以放 1,2,3
            // 当前result 里 最后一个字符得是字母才能 放数字
            if(curResult.length()==0 || Character.isLetter(curResult.charAt(curResult.length()-1)) ){
                curResult.append(i);
                dfs(curResult,result,word,cur_index+i,abbr_len+1);
                curResult.setLength(len); //恢复之前的长度
            }   
        }
        
      // put cur letter
        curResult.append(word.charAt(cur_index));
        dfs(curResult,result, word,cur_index+1,abbr_len+1);
        curResult.setLength(len);
    }
    
    private boolean validWordAbbreviation(String word, String abbr) {
        int index = 0;
        String count = "0";
        for(int i=0; i<abbr.length(); i++){
            char c = abbr.charAt(i);  
            if(Character.isLetter(c) ) {
                index = index + Integer.valueOf(count);
                if(index >= word.length() || c != word.charAt(index) ) return false;
                count = "0";
                index++;
            }  
            else {
                if(count.equals("0") && c=='0') return false;
                count += c;
               
            }
        }
    
        return index + Integer.valueOf(count) == word.length();
    }
}

class Node{
    String abbr;
    int len ;
    Node(String abbr, int len){
        this.abbr = abbr;
        this.len = len;
    }
}

 

转载于:https://www.cnblogs.com/keepAC/p/9946838.html

相关文章:

  • 多线程 start 和 run 方法到底有什么区别?
  • MongoDB----逻辑与物理存储结构
  • 2018北京理工大学区块链技术讲座
  • ide phpStorm 配置PHP路径并本地执行PHP脚本
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
  • taro 填坑之路(三)taro 缓存
  • deepin bashrc 文件修改后恢复方法
  • Python函数的基础知识
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 关于智能共享出行,政界、学界和业界的专家都说了什么? | SMC 2018
  • vue-cli 打包编译 -webkit-box-orient: vertical 被删除解决办法
  • django发送邮件
  • mysql如何设置两个默认时间列
  • Linux运维命令总结
  • 统计学习方法概论---泛化能力
  • 【EOS】Cleos基础
  • Javascript设计模式学习之Observer(观察者)模式
  • js如何打印object对象
  • spring security oauth2 password授权模式
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 工作中总结前端开发流程--vue项目
  • 和 || 运算
  • 算法之不定期更新(一)(2018-04-12)
  • 网页视频流m3u8/ts视频下载
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 在Mac OS X上安装 Ruby运行环境
  • 做一名精致的JavaScripter 01:JavaScript简介
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​flutter 代码混淆
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • ​水经微图Web1.5.0版即将上线
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #{}和${}的区别?
  • #if #elif #endif
  • (1)虚拟机的安装与使用,linux系统安装
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (四)Controller接口控制器详解(三)
  • (五)关系数据库标准语言SQL
  • (转)linux 命令大全
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET/C# 使用反射注册事件
  • .NET命名规范和开发约定
  • .NET上SQLite的连接
  • .NET委托:一个关于C#的睡前故事
  • .net下的富文本编辑器FCKeditor的配置方法
  • @Bean注解详解
  • [2013AAA]On a fractional nonlinear hyperbolic equation arising from relative theory
  • [ACTF2020 新生赛]Upload 1
  • [Android Pro] listView和GridView的item设置的高度和宽度不起作用
  • [BZOJ] 3262: 陌上花开
  • [C++]:for循环for(int num : nums)
  • [C++数据结构](31)哈夫曼树,哈夫曼编码与解码
  • [CERC2017]Cumulative Code
  • [EFI]Atermiter X99 Turbo D4 E5-2630v3电脑 Hackintosh 黑苹果efi引导文件