[Leetcode] Letter Combinations of a Phone Number
每个数字对应多个字符,给定一个数字串,给出所有与这个数字串对应的字符串。
一、使用递归的方式最容易想到了
1 import java.util.*; 2 3 public class Solution { 4 void backtree(String digits,int index,String numgroup[],List<String> strs,String assembleone){ 5 if(index==digits.length()) { 6 strs.add(assembleone); 7 return; 8 } 9 String groupone=numgroup[digits.charAt(index)-'0']; 10 for(int i=0;i<groupone.length();i++){ 11 backtree(digits,index+1,numgroup,strs,assembleone+groupone.substring(i,i+1)); 12 } 13 } 14 public List<String> letterCombinations(String digits) { 15 String numgroup [] ={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"}; 16 List<String> res=new LinkedList<String>(); 17 if(digits==null||digits.compareTo("")==0) return res; 18 backtree(digits,0,numgroup,res,""); 19 return res; 20 } 21 }
二、实际上这里的重点不是递归,是如何将这个算法改为非递归的方式。
实际上这里可以使用一个中数字进位的方式来对所有的编码方式进行遍历。
假设所给出的数字串的长度为N,我们初始化一个计数数组count[0,N-1],长度为N,这个计数数组的每一位的最大数字可能是不一样的,记为MAX[0,N-1]
initialize:
count[0,N-1]=0;
start:
我们对count进行加一操作,这里可能会导致进位,进位操作要根据MAX[0,N-1]来进行。
end:
如果所有位都达到了最大的值,那么算法停止。
举个栗子:
2:a\b\c
3:d\e
6:m\n\o
MAX为:3,2,3
count数组的变化为
- 0 0 0
- 0 0 1
- 0 0 2
- 0 1 0
- 0 1 1
- 0 1 2
- 1 0 0
- 1 0 1
- 1 0 2
- 1 1 0
- 1 1 1
- 1 1 2
- 2 0 0
- 2 0 1
- 2 0 2
- 2 1 0
- 2 1 1
- 2 1 2
思路已经很清新了!