?LeetCode刷題實戰(zhàn)411:最短獨占單詞縮寫

示例
示例1:
"apple", ["blade"] -> "a4"?(因為 "5"?或者 "4e"?同時也是 "blade"?的縮寫形式,所以它們是無效的縮寫)
示例2:
"apple", ["plain", "amber", "blade"] -> "1p3"?(其他有效的縮寫形式還包括 "ap3", "a3e", "2p2", "3le", "3l1")。
解題
class?Solution?{
public:
????string?minAbbreviation(string?target, vector<string>& dictionary)?{
????????if?(dictionary.empty()) return?to_string((int)target.size());
????????priority_queueint, string>, vector int, string>>, greater int, string>>> q;
????????q = generate(target);
????????while?(!q.empty()) {
????????????auto?t = q.top(); q.pop();
????????????bool?no_conflict = true;
????????????for?(string?word : dictionary) {
????????????????if?(valid(word, t.second)) {
????????????????????no_conflict = false;
????????????????????break;
????????????????}
????????????}
????????????if?(no_conflict) return?t.second;
????????}
????????return?"";
????}
????priority_queueint, string>, vector int, string>>, greater int, string>>> generate(string?target) {
????????priority_queueint, string>, vector int, string>>, greater int, string>>> res;
????????for?(int?i = 0; i < pow(2, target.size()); ++i) {
????????????string?out = "";
????????????int?cnt = 0, size = 0;
????????????for?(int?j = 0; j < target.size(); ++j) {
????????????????if?((i >> j) & 1) ++cnt;
????????????????else?{
????????????????????if?(cnt != 0) {
????????????????????????out += to_string(cnt);
????????????????????????cnt = 0;
????????????????????????++size;
????????????????????}
????????????????????out += target[j];
????????????????????++size;
????????????????}
????????????}
????????????if?(cnt > 0) {
????????????????out += to_string(cnt);
????????????????++size;
????????????}
????????????res.push({size, out});
????????}
????????return?res;
????}
????bool?valid(string?word, string?abbr)?{
????????int?m = word.size(), n = abbr.size(), p = 0, cnt = 0;
????????for?(int?i = 0; i < abbr.size(); ++i) {
????????????if?(abbr[i] >= '0'?&& abbr[i] <= '9') {
????????????????if?(cnt == 0?&& abbr[i] == '0') return?false;
????????????????cnt = 10?* cnt + abbr[i] - '0';
????????????} else?{
????????????????p += cnt;
????????????????if?(p >= m || word[p++] != abbr[i]) return?false;
????????????????cnt = 0;
????????????}
????????}
????????return?p + cnt == m;
????}
};
LeetCode刷題實戰(zhàn)402:移掉 K 位數字
LeetCode刷題實戰(zhàn)405:數字轉換為十六進制數
LeetCode刷題實戰(zhàn)406:根據身高重建隊列
LeetCode刷題實戰(zhàn)410:分割數組的最大值
