题目
Given a List of words, return the words that can be typed using letters of alphabet on only one row’s of American keyboard like the image below.
|
Note:
- You may use one character in the keyboard more than once.
- You may assume the input string will only contain letters of alphabet.
分析
输入一组单词,用vector容器封装,判断每个单词的所有字母是否在键盘的同一行,如果在同一行,留在vector中,否则移除,最后输出vector
思路
- 建立键盘三行的大小写字母表
- 遍历vector内的单词
- 对于每一个单词先确定首字母所在行号,再依次查看后面的字母是否跟首字母在同一行,一旦不一致,立刻从vector中删除该单词
问题总结
- 一开始上手打算用字符数组存放键盘表,折腾了好久发现一个严重的问题:数组作为参数传递时,传递的是指针,这时候再用sizeof()来求数组的长度实际上求得的是指针的长度,而非数组长度,所以数组作为传递参数时需要将其长度也作为一个参数传递,后续运算时才不会出错,所以改用string存储每一行字母。
- vector中用earse()删除元素时,返回值为:指向被删除元素的下一个元素的iterator,外层如果用for循环iter++,容易出现越界情况,所以采用了while循环
代码
|
改进
用STL中的unordered_set采用hash表的存储方式,查找时间复杂度最优可达常数,但尝试后并没有实质上的改变,可能是因为数据量不够大,没有凸显出来他的优势。
|
结果
上面两种方法