【算法】17. 电话号码的字母组合(多语言实现)

举报
二当家的白帽子 发表于 2024/07/01 10:32:48 2024/07/01
【摘要】 17. 电话号码的字母组合:给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 样例 1:输入: digits = "23" 输出: ["ad","ae","af","bd","be","bf","cd","ce","cf"] 样例 2:输入: digits = "" 输出: ...

17. 电话号码的字母组合:

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

样例 1:

输入:
	digits = "23"
	
输出:
	["ad","ae","af","bd","be","bf","cd","ce","cf"]

样例 2:

输入:
	digits = ""
	
输出:
	[]

样例 3:

输入:
	digits = "2"
	
输出:
	["a","b","c"]

提示:

  • 0 <= digits.length <= 4
  • digits[i] 是范围 ['2', '9'] 的一个数字。

分析

  • 面对这道算法题目,二当家的陷入了沉思。
  • 仔细看了看,好像没有什么特别的技巧。
  • 递归套娃大法比较直观,dfs,回溯。
  • 细节的地方在于字符串拼接,有些语言的字符串是不可变的,在字符串拼接上有可以优化的点。

题解

rust

const PHONE_MAP: &[&[char]] = &[&[], &[], &['a', 'b', 'c'], &['d', 'e', 'f'], &['g', 'h', 'i'], &['j', 'k', 'l'], &['m', 'n', 'o'], &['p', 'q', 'r', 's'], &['t', 'u', 'v'], &['w', 'x', 'y', 'z']];

impl Solution {
    pub fn letter_combinations(digits: String) -> Vec<String> {
        fn backtrack(ans: &mut Vec<String>, digits: &[u8], index: usize, buf: &mut Vec<u8>) {
            if index == digits.len() {
                ans.push(String::from_utf8(buf.clone()).unwrap());
            } else {
                let digit = (digits[index] - '0' as u8) as usize;
                PHONE_MAP[digit].iter().for_each(|c| {
                    buf[index] = *c as u8;
                    backtrack(ans, digits, index + 1, buf);
                });
            }
        }

        let mut ans = Vec::new();
        if digits.len() > 0 {
            backtrack(&mut ans, digits.as_bytes(), 0, &mut vec![0; digits.len()]);
        }
        ans
    }
}

go

var phoneMap [][]byte = [][]byte{{}, {}, {'a', 'b', 'c'}, {'d', 'e', 'f'}, {'g', 'h', 'i'}, {'j', 'k', 'l'}, {'m', 'n', 'o'}, {'p', 'q', 'r', 's'}, {'t', 'u', 'v'}, {'w', 'x', 'y', 'z'}}

func letterCombinations(digits string) []string {
	var ans []string

	var backtrack func(int, []byte)
	backtrack = func(index int, buf []byte) {
		if index == len(digits) {
			ans = append(ans, string(buf))
		} else {
			digit := digits[index]
			for _, c := range phoneMap[digit-'0'] {
				buf[index] = c
				backtrack(index+1, buf)
			}
		}
	}

	if len(digits) > 0 {
		backtrack(0, make([]byte, len(digits)))
	}

	return ans
}

c++

class Solution {
private:
    unordered_map<char, string> phoneMap{
            {'2', "abc"},
            {'3', "def"},
            {'4', "ghi"},
            {'5', "jkl"},
            {'6', "mno"},
            {'7', "pqrs"},
            {'8', "tuv"},
            {'9', "wxyz"}
    };

    void backtrack(vector<string> &ans, const string &digits, int index, string &buf) {
        if (index == digits.length()) {
            ans.emplace_back(buf);
        } else {
            char digit = digits[index];
            for (const char &c: phoneMap.at(digit)) {
                buf.push_back(c);
                backtrack(ans, digits, index + 1, buf);
                buf.pop_back();
            }
        }
    }

public:
    vector<string> letterCombinations(string digits) {
        vector<string> ans;

        if (digits.size() > 0) {
            string buf;
            backtrack(ans, digits, 0, buf);
        }

        return ans;
    }
};

java

class Solution {
    private static final char[][] PHONE_MAP = new char[][]{{},{},{'a','b','c'},{'d','e','f'},{'g','h','i'},{'j','k','l'},{'m','n','o'},{'p','q','r','s'},{'t','u','v'},{'w','x','y','z'}};

    public List<String> letterCombinations(String digits) {
        List<String> ans = new ArrayList<>();

        if (digits.length() > 0) {
            this.backtrack(ans, digits, 0, new char[digits.length()]);
        }

        return ans;
    }

    private void backtrack(List<String> ans, String digits, int index, char[] buf) {
        if (index == digits.length()) {
            ans.add(new String(buf));
        } else {
            int digit = digits.charAt(index) - '0';
            for (char c : PHONE_MAP[digit]) {
                buf[index] = c;
                backtrack(ans, digits, index + 1, buf);
            }
        }
    }
}

typescript

const phoneMap = {
    2: 'abc',
    3: 'def',
    4: 'ghi',
    5: 'jkl',
    6: 'mno',
    7: 'pqrs',
    8: 'tuv',
    9: 'wxyz',
};

function letterCombinations(digits: string): string[] {
    let ans = [];

    const backtrack = function (index: number, buf: string) {
        if (index == digits.length) {
            ans.push(buf);
        } else {
            const digit = digits[index];
            for (const c of phoneMap[digit]) {
                backtrack(index + 1, buf + c);
            }
        }
    };

    if (digits.length > 0) {
        backtrack(0, "");
    }

    return ans;
};

python

class Solution:
    PHONE_MAP = {
        "2": "abc",
        "3": "def",
        "4": "ghi",
        "5": "jkl",
        "6": "mno",
        "7": "pqrs",
        "8": "tuv",
        "9": "wxyz",
    }

    def letterCombinations(self, digits: str) -> List[str]:
        def backtrack(index: int):
            if index == len(digits):
                ans.append("".join(buf))
            else:
                digit = digits[index]
                for letter in Solution.PHONE_MAP[digit]:
                    buf.append(letter)
                    backtrack(index + 1)
                    buf.pop()

        ans = list()
        buf = list()
        if len(digits) > 0:
            backtrack(0)
        return ans


非常感谢你阅读本文~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://bbs.huaweicloud.com/community/usersnew/id_1628396583336561 博客原创~


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。