通过按下键盘输入文本的最短路径

我从用户自定义字符串。 现在,我需要设计的最短路线按压此字符串键盘,其中包括9个按键。

注意:

  • 该解决方案的信件应安排在按字母顺序排列,即A,B,C,D,E,...
  • 每个数字至少应包括一个键盘字符

解决方法如果输入的文本='你好'

  1. A B C D
  2. E,F,G
  3. H,I,J,K
  4. L,M,N
  5. O,P,Q
  6. R,S,T
  7. U,V,W
  8. X,Y
  9. ž

要么

  1. A B C D
  2. E,F,G
  3. H,I,J,K
  4. L,M,N
  5. Ø
  6. p
  7. q
  8. - [R
  9. S,T,U,V,W,X,Y,Z

与此键盘我需要的类型'你好'按3,2,4,4,5

所以,如果你想用这个设计键盘键入'你好',你只需要按下5键盘按钮,因为这是最少的数字键。

我认为这个问题与贪婪的方法或回溯算法解决。

--------------解决方案-------------

让我们来概括字母表{1,...,N}。 设k为键的数目。 对于1≤我<J2≤K,成本(=冲床数)可能键{1,...,J}是1F I + 2F I + 1 + ... +(J -我+ 1)的F j,其中 F I是字母i的频率。 我们正在寻找由k个按键的最低成本精确覆盖。

这个问题有以下最优子结构 :固定任意的最优解和除去含{M + 1,...,N}在其上的键。 其结果是为具有k的问题的最佳解决方案 - 1键和字母{1,...,M}; 否则,我们就可以提高通过重新排列前k第一个最佳的解决方案 - 1键。

因此,我们可以应用动态规划。 对于每一个0≤I≤n和每0≤Ĵ≤K,计算用于最佳安排{1,......,I}其中j密钥。 这种安排C I的成本,J满足复发

C 0,J = 0对于所有j≥0
C I,0 =∞对于所有i> 0
C I,J = 分钟0≤我'<I(C I',J-1 + C I',J)

其中c 的a,b是关键的成本{A,...,B}。 人们可以从最佳参数我'的顺序恢复安排本身。

每个有效的键盘对应设置为1由于只有2042975有效组合来尝试恰恰就是个位的26位数字,蛮力应该是在这之前需要更多的思考其他的方法来尝试的第一件事。 该算法会是这样的伪代码:

int best_score = int.max
list<int> keypads
for int mask between 1 and 1<<26
if bit_count(mask) != 9 or mask ends in 1 continue
int lookup[26]
int p = 1
for int i between 0 and 26
lookup[i] = p
if mask's bit i is set to 1, p = 1 ; otherwise, p = p + 1
int total = 0
for each char ch in word
total = total + lookup[ch]
if total < best
keypads = new list {mask}
best = total
else if total == best
keypads.add(mask)
print best, keypads

分类:C# 时间:2015-03-15 人气:0
本文关键词: 算法
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.444 (s). 10 q(s)