直通车:
Leetcode 500. 键盘行
Leetcode 1160. 拼写单词
Leetcode 1047. 删除字符串中的所有相邻重复项
Leetcode 1935. 可以输入的最大单词数
知识点补充:小写/大写字母转换、字符串与list的转换、字母计数
Leetcode 500. 键盘行
难度:简单
给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。
美式键盘 中:
- 第一行由字符 “qwertyuiop” 组成。
- 第二行由字符 “asdfghjkl” 组成。
- 第三行由字符 “zxcvbnm” 组成。
示例:
输入:words = [“Hello”,“Alaska”,“Dad”,“Peace”]
输出:[“Alaska”,“Dad”]
思路
- 将美式键盘字符串放入一个列表s;
- 遍历words里的每一个word,判断每一个word单词是否在s的同一行;
- 用一个函数来判断每个word的每个字母的小写,是否均处于s的同一行。函数返回true,输出。
代码
class Solution(object):
def findWords(self, words):
"""
:type words: List[str]
:rtype: List[str]
"""
list=[]
#思路:设定小写字母三个字符串,遍历
s=['qwertyuiop','asdfghjkl','zxcvbnm']
def check(word,Aword): #判断word的每个单词是否均在Aword里
for w in word:
if w.lower() not in Aword: #小写化
return False
return True
for Aword in s:
for word in words:
if check(word,Aword): #调用check()
list.append(word)
return list
补充
- python实现字符小写,word.lower()。
- python实现字符串去重,new_word=list(set(word))
Leetcode 1160. 拼写单词
难度:简单
给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars。
假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。
注意:每次拼写(指拼写词汇表中的一个单词)时,chars 中的每个字母都只能用一次。
返回词汇表 words 中你掌握的所有单词的 长度之和。
示例:
输入:words = [“cat”,“bt”,“hat”,“tree”], chars = “atach”
输出:6
解释:
可以形成字符串 “cat” 和 “hat”,所以答案是 3 + 3 = 6。
思路
遍历words与chars,只要出现w.count(i)>c.count(i),结束该word的遍历。
代码
class Solution(object):
def countCharacters(self, words, chars):
"""
:type words: List[str]
:type chars: str
:rtype: int
"""
ans = 0
for w in words:
for i in w:
if w.count(i) > chars.count(i):
break
else:
ans+=len(w)
return ans
Leetcode 1047. 删除字符串中的所有相邻重复项
难度:简单
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一
示例:
输入:“abbaca”
输出:“ca”
解释:
例如,在 “abbaca” 中,我们可以删除 “bb” 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 “aaca”,其中又只有 “aa” 可以执行重复项删除操作,所以最后的字符串为 “ca”。
思路
建一个stack,若为空栈,直接压入字符;若为非空,判断栈顶元素与该字符是否相等。若相等,删除栈顶元素;若不相等,入栈。最后输出字符串,利用join数组与字符串转换。
代码
class Solution(object):
def removeDuplicates(self, s):
"""
:type s: str
:rtype: str
"""
stack = list()
for i in s:
if not stack or stack[-1] != i:
stack.append(i)
else:
stack.pop()
return "".join(stack) #转换成字符串输出
Leetcode 1935. 可以输入的最大单词数
难度:简单
键盘出现了一些故障,有些字母键无法正常工作。而键盘上所有其他键都能够正常工作。
给你一个由若干单词组成的字符串 text ,单词间由单个空格组成(不含前导和尾随空格);另有一个字符串 brokenLetters ,由所有已损坏的不同字母键组成,返回你可以使用此键盘完全输入的 text 中单词的数目。
示例:
输入:text = “hello world”, brokenLetters = “ad”
输出:1
解释:无法输入 “world” ,因为字母键 ‘d’ 已损坏。
思路
- 将以空格为单词分割线的words字符串转换成数组;
- 遍历每一个word的每一个字母;
- 若字母出现在brokenLetters,则break,同时,需要增加一个flag记录是否是强制break退出;
- 检查flag,若正常退出则数目num+1。
代码
class Solution(object):
def canBeTypedWords(self, text, brokenLetters):
"""
:type text: str
:type brokenLetters: str
:rtype: int
"""
arr=text.split(' ')
flag,num=1,0
for text in arr:
for w in text:
if w in brokenLetters:
flag=0
break
if flag:
num=num+1
flag=1
return num
补充
字符串转数组
str = ‘1,2,3’
arr = str.split(‘,’) # 以’,'为节点,转数组
数组转字符串
arr = [‘a’,‘b’]
str = ‘,’.join(arr)
arr = [1,2,3]
str = ‘,’.join(str(i) for i in b)