/**
639 · 单词缩写
算法
Hard
Accepted Rate
44%
DescriptionSolutionNotesDiscussLeaderboard
Description
给出一组 n 个不同的非空字符串,您需要按以下规则为每个单词生成 最小 的缩写。
从第一个字符开始,然后加上中间缩写掉的字符的长度,后跟最后一个字符。
如果有冲突,就是多个单词共享相同的缩写,使用较长的前缀,而不是仅使用第一个字符,直到使单词的缩写的映射变为唯一。 换句话说,最终得到的缩写不能映射到多个原始单词。
如果缩写不会使单词更短,则不进行缩写,保持原样。
n 和每个单词的长度均不会超过 400。
每个单词的长度大于 1。
这些词只包括小写英文字母。
返回答案应该与原始数组保持相同的顺序。
Example
样例 1:
输入:
[“like”,“god”,“internal”,“me”,“internet”,“interval”,“intension”,“face”,“intrusion”]
输出:
[“l2e”,“god”,“internal”,“me”,“i6t”,“interval”,“inte4n”,“f2e”,“intr4n”]
样例 2:
输入:
[“where”,“there”,“is”,“beautiful”,“way”]
输出:
[“w3e”,“t3e”,“is”,“b7l”,“way”]
Tags
Company
Snapchat
谷歌
https://blog.csdn.net/iamlihongwei/article/details/79550958
https://blog.csdn.net/qq_46105170/article/details/109328602
https://www.lintcode.com/problem/639/
*/
import (
"fmt"
"strconv"
)
/**
* @param dict: an array of n distinct non-empty strings
* @return: an array of minimal possible abbreviations for every word
*/
func wordsAbbreviation(dict []string) []string {
// write your code here
var n int = len(dict)
var res []string = make([]string, n)
var mp map[string]int = make(map[string]int)
var pref []int = make([]int, n)
for i := 0; i < n; i++ {
pref[i] = 1
res[i] = getAbbr(dict[i], 1)
mp[res[i]] = mp[res[i]] + 1
}
var unique bool = false
for {
if unique {
break
}
unique = true
for i := 0; i < n; i++ {
if mp[res[i]] > 1 {
pref[i] += 1
res[i] = getAbbr(dict[i], pref[i])
mp[res[i]] = mp[res[i]] + 1
unique = false
}
}
}
return res
}
func getAbbr(s string, i int) string {
if i >= len(s)-2 {
return s
}
return s[0:i] + strconv.Itoa(len(s) - i - 1) + string(s[len(s)-1])
}
func main() {
var r1 []string = wordsAbbreviation([]string{"like", "god", "internal", "me", "internet", "interval", "intension", "face", "intrusion"})
fmt.Println(r1)
}