电话号码的字母组合(C#)
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
1.暴力法
看到这道题的第一思路就是建哈希表,然后将数字转化为对应字母之后进行组合
public IList<string> LetterCombinations(string digits)
{
List<string> result = new List<string>();
Hashtable hashtable = new Hashtable() { { "2", "abc" },
{ "3", "def" },
{ "4", "ghi" },
{ "5", "jkl"},
{ "6", "mno"},
{ "7", "pqrs"},
{ "8", "tuv"},
{ "9", "wxyz"} };
string s = (string)hashtable[digits[0].ToString()];
for (int i = 0; i < s.Length; i++)
{
result.Add(s[i].ToString());
}
for (int i = 1; i < digits.Length; i++)
{
int count_beforecopy = result.Count;
string current_s = (string)hashtable[digits[i].ToString()];
result = selfCopy(result, current_s.Length - 1);
for (int k = 0; k < result.Count; k++)
{
switch (k/count_beforecopy)
{
case 0:
result[k] += current_s[0];
break;
case 1:
result[k] += current_s[1];
break;
case 2:
result[k] += current_s[2];
break;
case 3:
result[k] += current_s[3];
break;
default:
break;
}
}
}
return result;
}
public static List<string> selfCopy(List<string> input,int times)
{
List<string> result = new List<string>(input.ToArray());
for (int i = 0; i < times; i++)
{
for (int j = 0; j < input.Count; j++)
{
result.Add(input[j]);
}
}
return result;
}
写的有点长,但是也懒得去优化了。。。
2.队列法
将第一个数字对应的字母入队,然后开始出队,将对头元素与下一个数字对应的字母进行组合,并将之入队,直到到达输入数字的末尾。
public IList<string> LetterCombinations1(string digits)
{
if (digits == "") return new List<string>();
List<string> result = new List<string>();
string[] map = new string[] { "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" };
// 2 3 4 5 6 7 8 9
Queue<string> queue = new Queue<string>();
string current_s = map[Convert.ToInt32(digits[0].ToString()) - 2];
enqueue(ref queue, null, current_s);
for (int i = 1; i < digits.Length; i++)
{
int l = queue.Count;
for (int j = 0; j < l; j++)
{
string s = queue.Dequeue();
enqueue(ref queue, s, map[Convert.ToInt32(digits[i].ToString()) - 2]);
}
}
result = queue.ToList();
return result;
}
public static void enqueue(ref Queue<string> queue,string s1,string s2)
{
for (int i = 0; i < s2.Length; i++)
{
queue.Enqueue((s1+s2[i]).ToString());
}
}
这个方法挺好的,思路比较清晰值得学习。