# 0320. Generalized Abbreviation
###### tags: `Leetcode` `Bit Manipulation` `Medium` `BackTracking` `Bit Mask`
Link: https://leetcode.com/problems/generalized-abbreviation/
## 思路
### Bit Mask
我们遍历00..0到11..1的所有n位二进制状态。如果某位上是0,那么对应位置的字符就保留。如果某位上是1,那么对应位置上的字符就要被缩略
### BackTracking
由于对于每个字符来说只有两种选择 abbreviate和不abbreviate
涉及到这种abbreviation类型的backtracking一定要小心
因为不确定abbreviation的数字长度 所以不能像其他题目一样dfs之后直接把最后一个element删掉就可以了
而是需要在末尾加上```curr.setLength(len);```
## Code
### Bit Mask
```java=
class Solution {
public List<String> generateAbbreviations(String word) {
List<String> ans = new ArrayList<>();
for(int i=0; i<(1<<word.length()); i++){
ans.add(abbr(word, i));
}
return ans;
}
private String abbr(String word, int mask){
StringBuilder sb = new StringBuilder();
int cnt = 0;
for(int i=0; i<word.length(); i++){
if(((mask>>i)&1)==0){
if(cnt!=0) sb.append(cnt);
cnt = 0;
sb.append(word.charAt(i));
}
else cnt++;
}
if(cnt!=0) sb.append(cnt);
return sb.toString();
}
}
```
### BackTracking
```python=
class Solution:
def generateAbbreviations(self, word: str) -> List[str]:
ans = []
def backtracking(start, count, currStr):
if start == len(word):
currStr += str(count) if count>0 else ""
ans.append(currStr[:])
else:
# stop adding count, keep current character
backtracking(start+1, 0, currStr+(str(count) if count>0 else "")+word[start])
# keep adding count
backtracking(start+1, count+1, currStr)
backtracking(0, 0, "")
return ans
```
```java=
class Solution {
public List<String> generateAbbreviations(String word) {
List<String> ans = new ArrayList<>();
dfs(ans, word, new StringBuilder(), 0, 0);
return ans;
}
private void dfs(List<String> ans, String word, StringBuilder curr, int start, int count){
int len = curr.length();
if(start==word.length()){
if(count!=0) curr.append(count);
ans.add(curr.toString());
}
else{
//abbreviation
dfs(ans, word, curr, start+1, count+1);
//no abbreviation
if(count!=0){
curr.append(count);
}
dfs(ans, word, curr.append(word.charAt(start)), start+1, 0);
}
curr.setLength(len);
}
}
```