File tree Expand file tree Collapse file tree 1 file changed +5
-4
lines changed
String/411.Minimum-Unique-Word-Abbreviation Expand file tree Collapse file tree 1 file changed +5
-4
lines changed Original file line number Diff line number Diff line change 2
2
3
3
此题不需要遍历所有的字典里的单词的缩写形式.
4
4
5
- 首先,我们应该注意到,如果字典里的单词和target的长度不一致,那么永远不会有冲突.所以一下子将范围缩小到那些与target等长的单词了.
5
+ 首先,我们应该注意到,缩写不会改变长度,所以两个长度不同的单词,他们的任何形式的缩写都不可能相同。所以对于字典里的那些与target的长度不一致的单词,完全可以忽略。
6
6
7
- 其次,缩写的方案怎么确定呢?其实就是任意一个字符可以选择取或不取.所以就是2^N次方,用一个N位的二进制数(作为mask)就可以表示了.有0的bit表示改成数字,有1的bit表示保留字母.这样一个mask就表示一种缩写方案.
7
+ 其次,targe的缩写方案有多少呢?不难判断,每一个字符只有两种选择:被缩写或者不被缩写。所以target的缩写形式只有2^m种可能。考虑到m是21,最多有2e6种缩写,是可以遍历过来的。对于无需剪枝的无脑遍历,使用bitmask来穷举所有缩写方式是最方便的,这与 ``` LC 320.Generalized-Abbreviation ``` 是一样的做法。当然,我们肯定先尝试长度短的缩写方法,再尝试长的缩写方法。所以需要将所有的缩写方法按照长度排序。
8
8
9
- 因此,我们不需要用DFS显式地穷尽字典或target的所有缩写字符串,只要逐个查验缩写方案即可.我们将所有mask按照题目中定义的长度按从小到大排序.每尝试一个mask,就查看依照这种缩写方案得到的target,是否与字典里的单词依靠同样一种缩写方案得到的字符串相同.如果没有冲突的,那么我们就可以立马选用这种缩写方案.
9
+ 最后,我们对于target的每一种缩写方式abbr,都要与字典里的每一个单词word进行匹配,看是否abbr是否也是word的一个缩写。这个算法和 ``` LC 408.Valid-Word-Abbreviation ``` 是一样的。
10
10
11
+ 所以总的时间复杂度是``` o(2^m*n) ``` . 因为题目给出了m+log(n)<=21,所以``` 2^m*n<=2^21 ``` ,即时间复杂度是2e6级别,是可行的。
11
12
12
- [ Leetcode Link] ( https://leetcode.com/problems/minimum-unique-word-abbreviation )
13
+ [ Leetcode Link] ( https://leetcode.com/problems/minimum-unique-word-abbreviation )
You can’t perform that action at this time.
0 commit comments