500. 键盘行
题目描述
给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。
美式键盘 中:
第一行由字符 “qwertyuiop” 组成。
第二行由字符 “asdfghjkl” 组成。
第三行由字符 “zxcvbnm” 组成。
代码示例
class Solution {
int findIndex(char c){
string keyboard[]={"qwertyuiop", "asdfghjkl", "zxcvbnm"};
int i;
for(i=0;i<3;++i){
for(auto j:keyboard[i]){
if(j==c){
return i;
}
}
}
return -1;
}
char getLowerCase(char c){
if(c>='A'&&c<'a'){
return c-'A'+'a';
}
return c;
}
public:
vector<string> findWords(vector<string>& words) {
int i,j,idx;
vector<string> ans;
for(i=0;i<words.size();++i){
for(idx=0;idx<3;++idx){
for(j=0;j<words[i].size();++j){
if(idx!=findIndex(getLowerCase(words[i][j]))){
break;
}
}
if(j==words[i].size()){
break;
}
}
if(idx<3){
ans.push_back(words[i]);
}
}
return ans;
}
};
解题思路
跟着英雄哥直播写的,最里层循环检测字符在第几层,当字符串都在一层时,就将结果加入ans
中
1160. 拼写单词
题目描述
给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars。
假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。
注意:每次拼写(指拼写词汇表中的一个单词)时,chars 中的每个字母都只能用一次。
返回词汇表 words 中你掌握的所有单词的 长度之和。
代码示例
class Solution {
public:
int countCharacters(vector<string>& words, string chars) {
unordered_map<char,int> chCnt;
unordered_map<char, int> wordCnt;
for (char c:chars) {
++chCnt[c];
}
int ans = 0;
for (string word : words) {
for (char c : word) {
++wordCnt[c];
}
bool flag = true;
for (char c : word) {
if (chCnt[c] < wordCnt[c]) {
flag = false;
break;
}
}
if (flag) {
ans += word.size();
}
wordCnt.clear();
}
return ans;
}
};
解题思路
哈希表分别对两个字符串进行计数,当后者的数量小于前者时,则不会这个单词,反之相反,每次记得清空对于字符串数组中字符串的哈希表
1047. 删除字符串中的所有相邻重复项
题目描述
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
代码示例
class Solution {
public:
string removeDuplicates(string s) {
string ans;
for(char c:s){
if (!ans.empty() && ans.back() == c) {
ans.pop_back();
} else {
ans.push_back(c);
}
}
return ans;
}
};
解题思路
破大防,看了官方题解我才知道原来string
容器自带pop
方法,救命。。。
1935. 可以输入的最大单词数
题目描述
键盘出现了一些故障,有些字母键无法正常工作。而键盘上所有其他键都能够正常工作。
给你一个由若干单词组成的字符串 text ,单词间由单个空格组成(不含前导和尾随空格);另有一个字符串 brokenLetters ,由所有已损坏的不同字母键组成,返回你可以使用此键盘完全输入的 text 中单词的数目。
代码示例
class Solution {
vector<string> split(string text){
vector<string> ret;
int i=0;
ret.push_back("");
for(auto s:text){
if(s==' '){
++i;
ret.push_back("");
continue;
}
ret[i].push_back(s);
}
return ret;
}
public:
int canBeTypedWords(string text, string brokenLetters) {
vector<string> spl=split(text);
int cnt=0;
bool flag;
for(int i=0;i<spl.size();++i){
flag=true;
for(char c:spl[i]){
for(char ch_b:brokenLetters){
if(c==ch_b){
flag=false;
break;
}
}
if(!flag){
break;
}
}
if(flag){
++cnt;
}
}
return cnt;
}
};
解题思路
手写了一个分词,然后遍历,计数即可!