【五月集训】第02天 —— 字符串


前言

        我的五月刷题日记,这两天在补充数据结构的知识,所以今天的题全部用python写的,等学完数据结构后再尝试用C语言写一遍。
        第二天:字符串


一、练习题目

题目链接难度
500. 键盘行★☆☆☆☆
1160. 拼写单词★☆☆☆☆
1047. 删除字符串中的所有相邻重复项★☆☆☆☆
1935. 可以输入的最大单词数★☆☆☆☆

二、思路与代码

1. 键盘行

        题目描述:给你一个字符串数组 words,只返回可以使用在键盘同一行的字母打印出来的单词。键盘中:第一行由字符 “qwertyuiop” 组成。第二行由字符 “asdfghjkl” 组成。第三行由字符 “zxcvbnm” 组成。

ord() 函数是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数,它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值,如果所给的 Unicode 字符超出了你的 Python 定义范围,则会引发一个 TypeError 的异常。

class Solution(object):
    def findWords(self, words):
        """
        :type words: List[str]
        :rtype: List[str]
        """
        ans = []
        rowIdx = "12210111011122000010020202" # 标注26个字母处在键盘上的行号
        for word in words:
            idx = rowIdx[ord(word[0].lower()) - ord('a')] # 第一个单词中第一个字母的行号
            if all(rowIdx[ord(ch.lower()) - ord('a')] == idx for ch in word): 
                ans.append(word) #将单词中每个字母的行号与第一个字母的行号比较,若单词中字母行号全部一致,则在ans列表中添加该单词
        return ans

2.拼写单词

        给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars。假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。(每次拼写(指拼写词汇表中的一个单词)时,chars 中的每个字母都只能用一次。返回词汇表 words 中你掌握的所有单词的 长度之和。)

class Solution(object):
    def countCharacters(self, words, chars):
        """
        :type words: List[str]
        :type chars: str
        :rtype: int
        """
        ans = 0
        for word in words:
            for i in word:
                if word.count(i) <= chars.count(i): # 比较每个字母的数量
                    flag = 1 # 符合条件时标记flag
                    continue
                else: 
                    flag = 0
                    break
            if flag == 1:    
                ans += len(word)
        return ans

3. 删除字符串中的所有相邻重复项

        给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

string.join(seq):以 string 作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串

class Solution(object):
    def removeDuplicates(self, s):
        """
        :type s: str
        :rtype: str
        """
        stack = list()
        for i in s:
            if not stack or i != stack[-1]:
                stack.append(i)
            else:
                stack.pop()
        return ''.join(stack) #合并stack为新的字符串

4.可以输入的最大单词数

键盘出现了一些故障,有些字母键无法正常工作。而键盘上所有其他键都能够正常工作。给你一个由若干单词组成的字符串 text ,单词间由单个空格组成(不含前导和尾随空格);另有一个字符串brokenLetters ,由所有已损坏的不同字母键组成,返回你可以使用此键盘完全输入的 text 中单词的数目。

class Solution(object):
    def canBeTypedWords(self, text, brokenLetters):
        """
        :type text: str
        :type brokenLetters: str
        :rtype: int
        """
        words = text.split(" ") # 将text以空格分开,得到一个单词列表
        ans = 0
        for word in words:
            if set(word) & set(brokenLetters): #比较每个单词的集合与顺坏按键是否有交集
               continue
            else:
                ans += 1
        return ans 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值