直通车:
Leetcode 500. 键盘行Leetcode 1160. 拼写单词Leetcode 1047. 删除字符串中的所有相邻重复项Leetcode 1935. 可以输入的最大单词数

知识点补充:小写/大写字母转换、字符串与list的转换、字母计数


题目

  • Leetcode 500. 键盘行
  • Leetcode 1160. 拼写单词
  • Leetcode 1047. 删除字符串中的所有相邻重复项
  • Leetcode 1935. 可以输入的最大单词数



Leetcode 500. 键盘行

难度:简单
给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。

美式键盘 中:

  • 第一行由字符 “qwertyuiop” 组成。
  • 第二行由字符 “asdfghjkl” 组成。
  • 第三行由字符 “zxcvbnm” 组成。

示例:
输入:words = [“Hello”,“Alaska”,“Dad”,“Peace”]
输出:[“Alaska”,“Dad”]

思路

  1. 将美式键盘字符串放入一个列表s;
  2. 遍历words里的每一个word,判断每一个word单词是否在s的同一行;
  3. 用一个函数来判断每个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’ 已损坏。

思路

  1. 将以空格为单词分割线的words字符串转换成数组;
  2. 遍历每一个word的每一个字母;
  3. 若字母出现在brokenLetters,则break,同时,需要增加一个flag记录是否是强制break退出;
  4. 检查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)