给你一个字符串word,由不同小写英文字母组成。
电话键盘上的按键与不同小写英文字母集合相映射,可以通过按压按键来组成单词。例如,按键2对应["a","b","c"],我们需要按一次键来输入"a",按两次键来输入"b",按三次键来输入"c"。
现在允许你将编号为2到9的按键重新映射到不同字母集合。每个按键可以映射到任意数量的字母,但每个字母必须恰好映射到一个按键上。你需要找到输入字符串word所需的最少按键次数。
返回重新映射按键后输入word所需的最少按键次数。
下面给出了一种电话键盘上字母到按键的映射作为示例。注意1,*,#和0不对应任何字母。
示例 1:
输入:word = "abcde"输出:5解释:图片中给出的重新映射方案的输入成本最小。 "a" -> 在按键 2 上按一次 "b" -> 在按键 3 上按一次 "c" -> 在按键 4 上按一次 "d" -> 在按键 5 上按一次 "e" -> 在按键 6 上按一次 总成本为 1 + 1 + 1 + 1 + 1 = 5 。 可以证明不存在其他成本更低的映射方案。
示例 2:
输入:word = "xycdefghij"输出:12解释:图片中给出的重新映射方案的输入成本最小。 "x" -> 在按键 2 上按一次 "y" -> 在按键 2 上按两次 "c" -> 在按键 3 上按一次 "d" -> 在按键 3 上按两次 "e" -> 在按键 4 上按一次 "f" -> 在按键 5 上按一次 "g" -> 在按键 6 上按一次 "h" -> 在按键 7 上按一次 "i" -> 在按键 8 上按一次 "j" -> 在按键 9 上按一次 总成本为 1 + 2 + 1 + 2 + 1 + 1 + 1 + 1 + 1 + 1 = 12 。 可以证明不存在其他成本更低的映射方案。
提示:
1 <= word.length <= 26word仅由小写英文字母组成。word中的所有字母互不相同。
分析:由于 word 中所有字母都互不相同,因此可以按照出现顺序,从 2-8 依次分配按键,分配完毕之后再回到 2,循环分配。
class Solution { public: int minimumPushes(string word) { int ans=0,n=word.size(),flag[30]={0}; for(int i=0,cnt=0;i<n;++i) { if(flag[word[i]-'a']==0) { if(cnt<8)flag[word[i]-'a']=1; else if(cnt<16)flag[word[i]-'a']=2; else if(cnt<24)flag[word[i]-'a']=3; else flag[word[i]-'a']=4; cnt++; } ans+=flag[word[i]-'a']; } return ans; } };