zoukankan      html  css  js  c++  java
  • LeetCode 527---Word Abbreviation

    527. Word Abbreviation

    Given an array of n distinct non-empty strings, you need to generate minimal possible abbreviations for every word following rules below.

    1. Begin with the first character and then the number of characters abbreviated, which followed by the last character.
    2. If there are any conflict, that is more than one words share the same abbreviation, a longer prefix is used instead of only the first character until making the map from word to abbreviation become unique. In other words, a final abbreviation cannot map to more than one original words.
    3. If the abbreviation doesn't make the word shorter, then keep it as original.

    Example:

    Input: ["like", "god", "internal", "me", "internet", "interval", "intension", "face", "intrusion"]
    Output: ["l2e","god","internal","me","i6t","interval","inte4n","f2e","intr4n"]

    Note:

    1. Both n and the length of each word will not exceed 400.
    2. The length of each word is greater than 1.
    3. The words consist of lowercase English letters only.
    4. The return answers should be in the same order as the original array.

    算法分析:

    构造HashMap<String,ArrayList>abbre2Word,以每个字符串的Abbreviation做键,向该键下的ArrayList内添加映射到该键的Word。对于每个Abbreviation,如果其映射的ArrayList的size()为1,则该abbreviation为unique的,将该(Word,Abbreviation)添加到另一个 HashMap<String,String> word2Abbre,该映射以 Word 做键,以Abbreviation 做值;如果abbre2Word中的Abbreviation对应的ArrayList的 size() 大于1,则以此ArrayList做参数递归调用函数来重新生成Abbreviation,并且调用函数的时候传入 prefix 长度参数,该参数比上一次调用增加1。

    Java算法实现:

    public class Solution {
        public List<String> wordsAbbreviation(List<String> dict) {
    		Map<String, String>map=new HashMap<>();
    		WordMap2Abbreviation(map, 0, dict);
    		List<String>result=new ArrayList<>();
    		int size=dict.size();
    		for(int i=0;i<size;i++){
    			result.add(map.get(dict.get(i)));//调整map中Abbreviation的顺序,使result中的Abbreviation与dict中同一位置上的word相对应
    		}
    		return result;
    	}
    	
    	public String getAbbreviation(String word,int fromIndex){//fromIndex表示从word的第几个字符开始生成缩写词
    		int len=word.length();
    		if(len-fromIndex<=3){//3个及以下的字符没有缩写的必要
    			return word;
    		}
    		else{
    			return word.substring(0, fromIndex+1)+String.valueOf(len-fromIndex-2)+word.charAt(len-1);
    		}
    	}
    	
    	public void WordMap2Abbreviation(Map<String, String>map,int fromIndex,List<String>dict){
    		Map<String,ArrayList<String>>abbre2Word=new HashMap<>();//以abbreviation做键,value为Abbreviation相同的word组成的ArrayList<String>
    		for(String word:dict){
    			String abbre=getAbbreviation(word, fromIndex);
    			if(abbre2Word.containsKey(abbre)){
    				abbre2Word.get(abbre).add(word);
    			}
    			else{
    				ArrayList<String>list=new ArrayList<>();
    				list.add(word);
    				abbre2Word.put(abbre, list);
    			}
    		}
    		for(String abbre:abbre2Word.keySet()){
    			ArrayList<String>words=abbre2Word.get(abbre);
    			if(words.size()==1){//说明该Abbreviation是unique的
    				map.put(words.get(0), abbre);
    			}
    			else{
    				WordMap2Abbreviation(map, fromIndex+1, words);//对这些Abbreviation相同的word递归调用函数
    			}
    		}
    	}
    }
  • 相关阅读:
    驼峰命名法
    Java中有关Null的9件事
    java开发中JDBC连接数据库代码和步骤
    TestNG 与 Junit的比较
    洛谷 P1880 [NOI1995]石子合并(区间dp,断环为链)
    洛谷 P1901 发射站(单调栈)
    洛谷 P2947 [USACO09MAR]向右看齐Look Up(单调栈)
    洛谷 P2629 好消息,坏消息(前缀和,单调队列,断环为链)
    洛谷 P3810 【模板】三维偏序(陌上花开)(CDQ分治)
    洛谷 CF429D Tricky Function(平面最近点对,分治)
  • 原文地址:https://www.cnblogs.com/dongling/p/6539600.html
Copyright © 2011-2022 走看看