Lintcode 639 · Word Abbreviation go

/**
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)
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值