17、电话号码的字母组合
sb.deleteCharAt(index);//StringBuffer新函数熟知
class Solution {
List<String> list=new ArrayList<>();
public List<String> letterCombinations(String digits) {
if(digits.length()==0) return list;//注意点:如果没有这一句输出的是[""] 而答案是[]
Map<Character,String>map=new HashMap<>();
StringBuffer sb=new StringBuffer();//把字符串的字符添加用StringBuffer
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");
backtracking(digits,map,0,sb);
return list;
}
public void backtracking(String digits,Map<Character,String>map,int index,StringBuffer sb){
if(index==digits.length()){//终止条件
list.add(sb.toString());
return ;
}
//digits=“23”
char c=digits.charAt(index);//获取digits的字符 eg:2
String res=map.get(c);//digits字符对应的字符串,将字符串进行组合
for(int i=0;i<res.length();i++){
sb.append(res.charAt(i));//eg:2对应的a
backtracking(digits,map,index+1,sb);//递归寻找3的字符串进行组合
sb.deleteCharAt(index);//删除索引的元素就是删除最后一个元素
//此时的index就是1
//因为index=0 取到2的a index=1取到3的d 这时候满足条件后return,执行sb.deleteCharAt(index)
//此时的index对应的就是1,即删除了索引为1的3对应的d
}
}
}
131、分割回文串
分割字符串画成树的样子
递归式,变量i和s的变化
变量总结
class Solution {
List<String>path=new ArrayList<>();
List<List<String>>ans=new ArrayList<>();
public List<List<String>> partition(String s) {
backtracking(s,0);
return ans;
}
public void backtracking(String s,int startIndex){
if(startIndex==s.length()){//终止条件
ans.add(new ArrayList<>(path));
return ;
}
for(int i=startIndex;i<s.length();i++){
//判断是否回文
if(isPalindrome(s,startIndex,i)){
//如果是回文,就截取字符串中回文的加入path中
String res=s.substring(startIndex,i+1);//左闭右开
path.add(res);
//下一次就是往下递归 故i+1
backtracking(s,i+1);
//回溯标志
path.remove(path.size()-1);
}else{
//如果不是回文,就跳过
continue;
}
}
}
public boolean isPalindrome(String s,int start,int end){
while(start<end){
if(s.charAt(start)!=s.charAt(end)){
return false;
}
start++;
end--;
}
return true;
}
}