最短独占单词缩写
难度:
标签:
题目描述
代码结果
运行时间: 68 ms, 内存: 16.3 MB
/*
* 题目思路:
* 使用Java Stream API生成target的所有可能缩写,然后找到字典中不存在的最短缩写。
*/
import java.util.*;
import java.util.stream.*;
public class Solution {
public String minAbbreviation(String target, String[] dictionary) {
List<String> abbrs = generateAbbreviations(target).stream()
.sorted(Comparator.comparingInt(String::length))
.collect(Collectors.toList());
return abbrs.stream()
.filter(abbr -> !isConflict(abbr, dictionary))
.findFirst()
.orElse("");
}
private List<String> generateAbbreviations(String word) {
List<String> result = new ArrayList<>();
generateAbbreviations(word, 0, new StringBuilder(), 0, result);
return result;
}
private void generateAbbreviations(String word, int pos, StringBuilder cur, int count, List<String> result) {
int len = cur.length();
if (pos == word.length()) {
if (count > 0) cur.append(count);
result.add(cur.toString());
} else {
generateAbbreviations(word, pos + 1, cur, count + 1, result);
if (count > 0) cur.append(count);
cur.append(word.charAt(pos));
generateAbbreviations(word, pos + 1, cur, 0, result);
}
cur.setLength(len);
}
private boolean isConflict(String abbr, String[] dictionary) {
return Arrays.stream(dictionary).anyMatch(word -> match(word, abbr));
}
private boolean match(String word, String abbr) {
int m = word.length(), n = abbr.length();
int i = 0, j = 0;
while (i < m && j < n) {
if (Character.isDigit(abbr.charAt(j))) {
if (abbr.charAt(j) == '0') return false;
int start = j;
while (j < n && Character.isDigit(abbr.charAt(j))) j++;
int num = Integer.parseInt(abbr.substring(start, j));
i += num;
} else {
if (word.charAt(i++) != abbr.charAt(j++)) return false;
}
}
return i == m && j == n;
}
}
解释
方法:
该题解使用位掩码来枚举target字符串的所有可能的缩写形式。对于字典中的每个单词,计算它与target的位掩码差异,并将差异掩码存储在一个集合中。然后枚举target的所有可能的位掩码,检查每个掩码是否能够区分target和字典中的所有单词。在所有有效的掩码中,选择对应的缩写长度最短的那个作为最终答案。
时间复杂度:
O(mn + m2^n)
空间复杂度:
O(m + n)
代码细节讲解
🦆
题解中提到使用位掩码来枚举target字符串的所有可能缩写形式,这种方法在实际编程中是如何实现的?能否具体解释一下位掩码是如何与target字符串的缩写形式对应的?
▷🦆
在检查每个掩码是否能区分target和字典中所有单词时,条件`i & mask > 0`是如何确保掩码能有效区分不同单词的?是否存在更简单或更直观的方式来理解这一逻辑?
▷🦆
函数`getAbbr`中的变量`prev`的作用是什么?如何通过这个变量计算缩写中数字的位置和数目?
▷