思路:
"给出子集"这四个字就让人联想到深度优先(回溯算法)
这题与前面几题不同的是,要搜索2个地方的字符串
代码:
class Solution {
public List<String> letterCombinations(String digits) {
List<String> res=new ArrayList<>();
if(digits.length()==0) return res;
StringBuilder path=new StringBuilder();
HashMap<Character,String> map=new HashMap<>();
map.put('2',"abc");
map.put('3',"def");
map.put('4',"ghi");
map.put('5',"jkl");
map.put('6',"mno");
map.put('7',"pqrs");
map.put('8',"tuv");
map.put('9',"wxyz");
bfs(res,0,digits,map,path);
return res;
}
private void bfs(
List<String> res,
int index,
String digits,
HashMap<Character,String> map,
StringBuilder path
){
if(index==digits.length()){
res.add(String.valueOf(path));
return;
}
char c=digits.charAt(index);
String s=map.get(c);
for(int i=0;i<s.length();i++){
path.append(s.charAt(i));
bfs(res,index+1,digits,map,path);
path.deleteCharAt(index);
}
}
}
分解:
1)将每个数字代表的字符串存到一个哈希表中,后面进行检索
2)这里仍然可以用res中加入path的形式,但是这里的res是List<String>形式
3)当数字到达digits.length()时加入res,这里仍然不能把path直接加入到res中
if(index==digits.length()){
res.add(String.valueOf(path));
return;
}
4)此题最核心的点是:
index表示的是digits的位置,也就是搜索不同地方的字符串
但是循环题中的限制条件是当前地区的字符串s的长度
char c=digits.charAt(index);
String s=map.get(c);
for(int i=0;i<s.length();i++){
path.append(s.charAt(i));
bfs(res,index+1,digits,map,path);
path.deleteCharAt(index);
}
5)StringBuilder的删除方法是deleteCharAt(index)