LeetCode 320. 列举单词的全部缩写(回溯/位运算)
生活随笔
收集整理的這篇文章主要介紹了
LeetCode 320. 列举单词的全部缩写(回溯/位运算)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1. 題目
- 2. 解題
- 2.1 回溯
- 2.2 位運算
1. 題目
請你寫出一個能夠舉單詞全部縮寫的函數。
注意:輸出的順序并不重要。
示例: 輸入: "word" 輸出: ["word", "1ord", "w1rd", "wo1d", "wor1", "2rd", "w2d", "wo2", "1o1d", "1or1", "w1r1", "1o2", "2r1", "3d", "w3", "4"]來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/generalized-abbreviation
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 解題
2.1 回溯
class Solution {vector<string> ans;int n; public:vector<string> generateAbbreviations(string word) {string empty;n = word.size();dfs(word, empty, 0, 0);return ans;}void dfs(string& word, string& cur, int tailnum, int i){ //tailnum 表示尾部現在有多少個連續的縮寫,i 表示遍歷到哪了if(i == n){if(tailnum > 0)cur += to_string(tailnum);ans.push_back(cur);return;}int curlen = cur.size();//記錄當前長度//當前的字符縮寫dfs(word, cur, tailnum+1, i+1);cur.resize(curlen);//回溯,刪除后面的字符//不縮寫,前面有數字的話需要加上if(tailnum > 0)cur += to_string(tailnum);cur += word[i];//不縮寫dfs(word, cur, 0, i+1);//尾部縮寫數量清0cur.resize(curlen);//回溯} };72 ms 21.5 MB
2.2 位運算
class Solution { public:vector<string> generateAbbreviations(string word) {vector<string> ans;int n = word.size(), i, j, k, zero;for(i = 0; i < (1<<n); ++i)//每位字符兩種狀態,2進制{zero = 0;//0表示字符替換為縮寫,記錄連續的個數k = 0;//遍歷的word字符的位置string w;for(j = 0; j < n; ++j,++k){if((i>>j)&1)//該位不替換{if(zero > 0)w += to_string(zero);w += word[k];zero = 0;}elsezero++;}if(zero > 0)w += to_string(zero);ans.push_back(w);}return ans;} };132 ms 17.7 MB
我的CSDN博客地址 https://michael.blog.csdn.net/
長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!
總結
以上是生活随笔為你收集整理的LeetCode 320. 列举单词的全部缩写(回溯/位运算)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 659. 分割数组为连
- 下一篇: 牛客 挑选方案问题(排列组合)