力扣(十七) 电话号码的字母组合(回溯算法)

题目描述
力扣(十七) 电话号码的字母组合(回溯算法)_第1张图片
引入:回溯

回溯算法模板:

result = []
def backtrack(路径, 选择列表):
    if 满足结束条件:
        result.add(路径)
        return
    
    for 选择 in 选择列表:
        做选择
        backtrack(路径, 选择列表)
        撤销选择

算法核心:
1、路径:也就是已经做出的选择。
2、选择列表:也就是你当前可以做的选择。
3、结束条件:也就是到达决策树底层,无法再做选择的条件。

引用:作者:labuladong
链接:扒一扒回溯算法的裤子

解题

public class Solution {
    IList<string> results = new List<string>();
        public IList<string> LetterCombinations(string digits)
        {
            if (string.IsNullOrWhiteSpace(digits)) return results;//判断是否为空
            Dictionary<int, string> Dr = new Dictionary<int, string> { { 2, "abc" }, { 3, "def" }, { 4, "ghi" }, { 5, "jkl" }, { 6, "mno" }, { 7, "pqrs" }, { 8, "tuv" }, { 9, "wxyz" }, };
//字典
            _LetterCombinations(digits, String.Empty, Dr, 0);

            return results;

        }
        private void _LetterCombinations(string digits, string log, Dictionary<int, string> map, int level)
        {
            //是否到最底层,到最底层则创建新路径
            if (log.Length == digits.Length) //terminator
            {
                results.Add(log);
                return;
            }

            string str = map[int.Parse(digits.ElementAt(level).ToString())]; //当前层选择列表
            for (int i = 0; i < str.Length; i++) //遍历列表
            {
                log = log + str[i]; //进行选择
                _LetterCombinations(digits, log, map, level + 1); //递归遍历下一层
                log = log.Remove(log.Length - 1); //遍历完一层后返回上一层的下一个选择
            }
        }
}

你可能感兴趣的:(c#)