Write a function to generate the generalized abbreviations of a word.
Example:
Given word = 
"word", return the following list (order does not matter):["word", "1ord", "w1rd", "wo1d", "wor1", "2rd", "w2d", "wo2", "1o1d", "1or1", "w1r1", "1o2", "2r1", "3d", "w3", "4"]
Understand the problem:
A classic dfs + backtracking problem. A trick here is if we've already abbrivate part of a word, we must jump at least a character.
Code (Java):
public class Solution {
    public List<String> generateAbbreviations(String word) {
        List<String> result = new ArrayList<>();
        result.add(word);
        generateHelper(0, word, result);
        
        return result;
    }
    
    private void generateHelper(int start, String s, List<String> result) {
        if (start >= s.length()) {
            return;
        }
        
        for (int i = start; i < s.length(); i++) {
            for (int j = 1; i + j <= s.length(); j++) {
                String num = Integer.toString(j);
                String abbr = s.substring(0, i) + num + s.substring(i + j);
                result.add(abbr);
                generateHelper(i + 1 + num.length(), abbr, result); // skip 1b
            }
        }
    }
}
Recursive solution with Swift:
ReplyDeletefunc generalizedAbbreviation(str: String) -> [String]{
var result = [String]()
var sb = String()
generalizedAbbreviationHelprt(str, start: 0, sb: &sb, result: &result)
return result
}
func generalizedAbbreviationHelprt(str: String, start: Int, inout sb: String, inout result: [String], isNumber: Bool = false){
if start >= str.characters.count {
result.append(sb)
return
}
let currentChar = str[start]
sb.append(currentChar)
generalizedAbbreviationHelprt(str, start: start+1, sb: &sb, result: &result)
sb.removeAtIndex(sb.endIndex.predecessor())
if isNumber == false {
var counter = 1
for _ in start..<str.characters.count {
sb.append(String(counter)[0])
generalizedAbbreviationHelprt(str, start: start+counter, sb: &sb, result: &result, isNumber: true)
sb.removeAtIndex(sb.endIndex.predecessor())
counter++
}
}
}