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.
Example 1:
Input: ["Hello", "Alaska", "Dad", "Peace"]
Output: ["Alaska", "Dad"]
Note:
原题链接:https://leetcode.com/problems/keyboard-row/?tab=Description
给出n个字符串,从而判断每个字符串中的字符是否来自美式键盘上的同一行,若来自同一行,返回该string。逐个word去比较即可。
将键盘上的每行字符存储到相应的vector或者数组中,然后循环Input中的每个string,并且循环string中的每个char,从而进行比较。
class Solution {
public:
vector<string> findWords(vector<string>& words) {
unordered_set<char> set1 = {
'q','w','e','r','t','y','u','i','o','p'};
unordered_set<char> set2 = {
's','d','f','g','h','j','k','l','a'};
unordered_set<char> set3 = {
'z','x','c','v','b','n','m'};
vector<unordered_set<char>> sets = {set1, set2, set3};
vector<string> result;
for (int i = 0; i < words.size(); i++){
//将word转化为小写
string lower_words = words[i];
transform(lower_words.begin(),lower_words.end(),lower_words.begin(), ::tolower);
//先从words的第一个字符看是第几行的
int index = 0;
if (set1.find(lower_words[0]) != set1.end())
index = 0;
else if (set2.find(lower_words[0]) != set2.end())
index = 1;
else if (set3.find(lower_words[0]) != set3.end())
index = 2;
//保存第一次字符所在的行
unordered_set<char> tmpSet = sets[index];
int flag = 0;
//遍历word的每一个字符,如果有一个字符没在第一个字符所在行的set中找到,就退出
for (char c:lower_words){
if(tmpSet.find(c) == tmpSet.end()){
flag = 1;
break;
}
}
if (!flag)
result.push_back(words[i]);
}
return result;
}
};
C++的Standard Library并没有提供将std::string转成大写和小写的功能,只有在提供将char转成大写(toupper)和小写(tolower)的功能。可以利用STL的transform配合toupper/tolower,完成std::string转换大(小)写的功能。
或者在set中把大小写字符都罗列一遍。
利用set的特性,判断元素是否在集合中
class Solution(object):
def findWords(self, words):
"""
:type words: List[str]
:rtype: List[str]
"""
rs = map(set, ['qwertyuiop','asdfghjkl','zxcvbnm'])
ans = []
for word in words:
wset = set(word.lower())
if any(wset <= rset for rset in rs):
ans.append(word)
return ans
map
map(function, iterable, ...)
对可迭代函数’iterable’中的每一个元素应用‘function’方法,将结果作为list返回。
更多:https://my.oschina.net/zyzzy/blog/115096
set
set是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素。无法通过数字进行索引。
>>> set('abbac')
set(['a', 'c', 'b'])
s.issubset(t)
s <= t
测试是否 s 中的每一个元素都在 t 中
s.issuperset(t)
s >= t
测试是否 t 中的每一个元素都在 s 中
更多:http://blog.csdn.net/business122/article/details/7541486
any
any(...)
any(iterable) -> bool
Return True if bool(x) is True for any x in the iterable.
If the iterable is empty, return False.
iterable的任何元素都为False、0,”,或者iterable全为空,则any(iterable)为False,否则为True
all():”有‘假’为False,全‘真’为True,iterable为空是True”
any():”有‘真’为True,全‘假’为False,iterable为空是False”