C# 按键盘输入文本的最短路径

C# 按键盘输入文本的最短路径,c#,algorithm,C#,Algorithm,我从用户处获得自定义字符串。现在,我需要设计一个最短的路径,在包括9个按钮的键盘上按下这个字符串 注: 解决方案字母应按字母顺序排列,即a、b、c、d、e 每个数字应至少包含一个键盘字符 如果输入文本为“hello”,则解决方案 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 或 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 使用这个键盘,我需要按3,2

我从用户处获得自定义字符串。现在,我需要设计一个最短的路径,在包括9个按钮的键盘上按下这个字符串

注:

  • 解决方案字母应按字母顺序排列,即a、b、c、d、e
  • 每个数字应至少包含一个键盘字符
如果输入文本为“hello”,则解决方案

  • 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
  • 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
  • 使用这个键盘,我需要按3,2,4,4,5输入“hello”

    因此,如果你想用这个设计好的键盘输入“hello”,你只需要按5个键盘按钮,因为这是最少的按键数


    我认为这个问题是通过贪婪方法或回溯算法来解决的。

    每个有效键盘对应一个26位数字,其中9位正好设置为1。只有2042975个有效的组合可以尝试,暴力应该是第一个尝试的东西,在其他需要更多思考的方法之前。该算法类似于以下伪代码:

    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
    
    int最佳_分数=int.max
    列出键盘
    
    对于介于1和1之间的整数掩码,让我们将字母表推广到{1,…,n}。设k为键数。一≤ i 该问题具有以下最优子结构:固定任意最优解并移除上面有{m+1,…,n}的键。结果是具有k-1键和字母{1,…,m}的问题的最优解;否则,我们可以通过重新排列第一个k-1键来改进第一个最优解

    因此,我们可以应用动态规划。每0≤ 我≤ n每0≤ J≤ k、 用j键计算{1,…,i}的最佳排列。该安排的成本Ci,j满足重复性要求

    C0,对于所有j,j=0≥ 0
    Ci,0=∞ 对于所有i>0
    Ci,j=min0≤ i'
    其中ca,b是密钥{a,…,b}的成本。一个人可以从最优参数序列中恢复排列本身。

    @rene不,这不是一个重要的问题,但我认为这个问题太笼统了,对其他人来说永远不会有用。@唉,我不同意:虽然这个问题的具体答案可能对其他人没有用处,提供一个解决问题的好方法的答案可能很有价值。但是,如果输入流包含的字符超过
    k
    个,那么您的最优子结构就不起作用了。e、 Gk=4,输入字符串是“字符串”,你们将如何处理这个问题,我想你们说的是第一件事,但它不是最优的。事实上,这是一个贪婪的解决方案,而不是DP。