LeetCode784 字母大小写全排列

字母大小写全排列>>>
LeetCode784 字母大小写全排列_第1张图片

  • 这一类搜索问题是在一颗隐式树上进行搜索的问题,即树形问题.因此,先画出递归树是十分重要的,然后看着图形把代码写出来
  • 问题所求的解,就是这颗树的叶子节点的值,因此,可以使用深度优先遍历,得到叶子节点的值,这样的算法也叫回溯算法
  • 回溯算法的显著特征是状态重置,而由于字符串在拼接过程中,每次都产生新字符串,因此,在叶子节点处,直接保存即可

package BDyNamicProgramming;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/4/26 0026  18:38
 */
public class Problem784 {


    /**
     * 这一类搜索问题是在一个饮食的树上进行搜索到问题,即树形问题,
     * 因此,先画出递归树是十分重要的:然候看着图形把代码写出来
     *
     * @param S
     * @return
     */
    public List<String> letterCasePermutation(String S) {
        List<String> rs = new ArrayList<>();

        dfs(S,0,rs,new StringBuilder());

        return rs;

    }

    /**
     *
     * @param S
     * @param start S遍历到的位置
     * @param rs
     * @param sb
     */
    public void dfs(String S,int start,List<String> rs,StringBuilder sb){

        if(start==S.length()){
            rs.add(sb.toString());
            return;
        }

        //假如当前start的位置为字符,则会产生分支
        if(S.charAt(start)>=65&&S.charAt(start)<=122){

                //大写字母
            sb.append((S.charAt(start)+"").toLowerCase());
            dfs(S,start+1,rs,sb);
            sb.deleteCharAt(sb.length()-1);


            sb.append((S.charAt(start)+"").toUpperCase());
            dfs(S,start+1,rs,sb);
            sb.deleteCharAt(sb.length()-1);


        } else{
            sb.append(S.charAt(start));
            dfs(S,start+1,rs,sb);
            sb.deleteCharAt(sb.length()-1);
        }




    }


    public static void main(String[] args) {
        String s = "a1";
        Problem784 problem784 = new Problem784();
        List<String> list = problem784.letterCasePermutation(s);
        System.out.println(list);
    }



}


你可能感兴趣的:(leetcode刷题笔记)