前言
我的五月刷题日记,这两天在补充数据结构的知识,所以今天的题全部用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