C# 按键盘输入文本的最短路径
我从用户处获得自定义字符串。现在,我需要设计一个最短的路径,在包括9个按钮的键盘上按下这个字符串 注: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
- 解决方案字母应按字母顺序排列,即a、b、c、d、e
- 每个数字应至少包含一个键盘字符
我认为这个问题是通过贪婪方法或回溯算法来解决的。每个有效键盘对应一个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。