LeetCode刷题Medium篇Letter Combinations of a Phone Number

题目

Given a string containing digits from 2-9 inclusive, return all possible letter combinations that the number could represent.

A mapping of digit to letters (just like on the telephone buttons) is given below. Note that 1 does not map to any letters.

Example:

Input: "23"
Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

Note:

Although the above answer is in lexicographical order, your answer could be in any order you want.

十分钟尝试

做过排序组合的题目,用的回溯法,但是回溯法掌握的不熟练。用两层for循环?先存储数字和字符的映射关系?感觉有些复杂。应该有更好的方法。看了一下解法,主要思路:

1 用队列存储上一次的遍历结果,当队列里面元素长度不等于数字长度,表示没有遍历完全,继续

2 每次遍历过程中,入队的元素先进先出,所以层与层之间,如果这层处理完,remove增加才会处理下一层

class Solution {
    public List<String> letterCombinations(String digits) {
        LinkedList<String> res = new LinkedList<String>();
		if(digits.isEmpty()) return res;
		String[] mapping = new String[] {"0", "1", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
        //添加一个空元素,保证第一个字符串入队
        res.add("");
        while(res.peek().length()!=digits.length()){
            String removed=res.remove();
            String toAddElement=mapping[digits.charAt(removed.length())-'0'];
            for(char ch:toAddElement.toCharArray()){
                res.addLast(removed+ch);
            }
        }
        return res;
    }
}

我们修改一下这个题目,这个题目本身就是求下面的问题:

一个字符串数组[“abc”,“def”] 输出所有的可能的排列组合。其实是一样的,比如题目给定数字23,2对应abc,3对应def。就是求abc和def的所有的排列组合

 我们用刚刚学习到的BFS思路学习解决一下。这样,这个思路就比较通用。看下面成功的代码, 所以我可以试图解决其他排列组合的问题,包括之前用回溯法解法的问题,回溯法不太容易理解,可以考虑用BFS的这个思路解决,很不错,先看字符串的排列组合解法

package com.puhui.goosecard.manage;

import java.util.LinkedList;
import java.util.List;

/**
 * 2 * @Author: kerry
 * 3 * @Date: 2018/12/7 10:18
 * 4
 */
public class Test {

    public static List<String> letterCombinations(String[] inputs) {
        LinkedList<String> res = new LinkedList<String>();
        if (inputs.length == 0) {
            return res;
        }
        res.add("");
        //最后排列组合的每个元素长度和输入的字符长度一样,所以可以判断
        while (res.peek().length() != inputs.length) {
            String remove = res.remove();
            String toAddQueue = inputs[remove.length()];
            for (char c : toAddQueue.toCharArray()) {
                res.addLast(remove + c);
            }
        }
        return res;
    }

    public static void main(String[] args) {
        String[] inputs = {"abc", "def", "kfg"};
        System.out.println(letterCombinations(inputs));

    }
}

数字也可以,所以我们发现了一种解决排列组合问题的新思路:

package com.puhui.goosecard.manage;

import java.util.LinkedList;
import java.util.List;

/**
 * 2 * @Author: kerry
 * 3 * @Date: 2018/12/7 10:18
 * 4
 */
public class Test {

    public static List<String> letterCombinations(String[] inputs) {
        LinkedList<String> res = new LinkedList<String>();
        if (inputs.length == 0) {
            return res;
        }
        res.add("");
        //最后排列组合的每个元素长度和输入的字符长度一样,所以可以判断
        while (res.peek().length() != inputs.length) {
            String remove = res.remove();
            String toAddQueue = inputs[remove.length()];
            for (char c : toAddQueue.toCharArray()) {
                res.addLast(remove + c);
            }
        }
        return res;
    }

    public static void main(String[] args) {
        String[] inputs = {"23", "16", "54"};
        System.out.println(letterCombinations(inputs));

    }
}

猜你喜欢

转载自blog.csdn.net/hanruikai/article/details/85328954