力扣----字符串

题目

  1. 500. 键盘行
  2. 1160. 拼写单词
  3. 1047. 删除字符串中的所有相邻重复项
  4. 1935. 可以输入的最大单词数
  5. 2278. 字母在字符串中的百分比
  6. 551. 学生出勤记录 I
  7. 2255. 统计是给定字符串前缀的字符串数目
  8. 1071. 字符串的最大公因子

解题思路与代码详情

【题1】500. 键盘行

500. 键盘行: 给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示
在这里插入图片描述

题目解析: 相当于按美式键盘顺序构成三个字典集,然后确定所给定字符串数组是否可以在这三个字典集中找到,如果可以找到,就输出这个字符串
解题思路:

  1. 首先按美式键盘的排列构建包含三个“字典”的数据库,因为题目中没有规定字符的大小写,所以“字典”构建时需要同时包含大小写字母。
  2. 逐个验证所给字符串数组中的每个字符串是否可以在三个字典中查到,若可以查到,则需要作为一个输出返回。
# python3
class Solution:
    def findWords(self, words: List[str]) -> List[str]:
        s1="qwertyuiopQWERTYUIOP"
        s2="asdfghjklASDFGHJKL"
        s3="zxcvbnmZXCVBNM"
        lists = [s1,s2,s3]
        ret=[]
        nlists = len(lists)
        nwords = len(words)
        for i in range(nwords):
            for j in range(nlists):
                if set(words[i]).intersection(set(lists[j]))==set(words[i]):
                    ret.append(words[i])
        return ret

【题2】1160. 拼写单词

1160. 拼写单词: 给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars。

假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。

注意:每次拼写(指拼写词汇表中的一个单词)时,chars 中的每个字母都只能用一次。

返回词汇表 words 中你掌握的所有单词的长度之和

题目解析: 相当于给你一定数量的字母卡片,使用卡片来拼出所给【词汇表】中的单词,如果能拼出则记录这个单词的长度,最后返回所有可以拼出的单词的长度。
解题思路:

  1. 首先需要清楚所给的字母卡片到底有什么字母,每个字母有多少张。
  2. 逐个验证单词都是由哪些字母构成的,分别需要的字母数是多少。如果所给的字母卡片中没有或缺失构成这个单词的字母,或者有构成这个单词的字母但是数量不够,比如hello这个单词需要两个字母为L的卡片,如果我们的字母卡片中只有一个L,那么这个单词的拼写认定失败;
  3. 若单词拼写成功,则记录拼写成功的每个单词的长度,返回所有拼写成功的单词的总长度。
#python3
class Solution:
    def countCharacters(self, words: List[str], chars: str) -> int:
        listchars = collections.Counter(chars)
        #print(listchars)
        flag = 1
        ans=0
        for word in words:
            wordlist = collections.Counter(word)
            for charcter in wordlist:
                if listchars[charcter]<wordlist[charcter]:
                    break
            else:
                ans+=len(word)
        return ans

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

1047. 删除字符串中的所有相邻重复项: 给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。

在 S 上反复执行重复项删除操作,直到无法继续删除。

在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

题目解析: 给定的字符串中可能会有相同的字符相邻,一旦有相邻的情况,就把两个相同且相邻的字符删掉,但删掉后,原来的字符串的字符位置会发生改变,被删掉元素的位置会被后面的元素占据,因此新的字符串可能又出现新的重复情况。
解题思路:
重新开辟一块空间,一次判断新的空间中放入的最后一个字符是否跟遍历中的原来数组中的字符相同,若相同则删除新的空间中的最后一个元素,不相同则将原数组中的字符添加到新的空间中。

#python3
class Solution:
    def removeDuplicates(self, s: str) -> str:
        ret = []
        for ch in s:
            if ret and ret[-1]==ch:
                ret.pop()
            else:
                ret.append(ch)
        return "".join(ret)

【题4】1935. 可以输入的最大单词数

1935. 可以输入的最大单词数: 键盘出现了一些故障,有些字母键无法正常工作。而键盘上所有其他键都能够正常工作。

给你一个由若干单词组成的字符串 text ,单词间由单个空格组成(不含前导和尾随空格);另有一个字符串 brokenLetters ,由所有已损坏的不同字母键组成,返回你可以使用此键盘完全输入的 text 中单词的数目。

题目解析: 字符串由不同个数的英文单词构成,键盘上有些键损坏,所以所给字符串中的单词无法敲击出来,记录用没有损坏的键能敲击出来的单词数量。
解题思路:

  1. 首先将每个单词都分离出来。
  2. 确定每个单词中的字母是可以敲击出来的,如果能敲击出来,则计入累加敲击成功的数目中。
class Solution:
    def canBeTypedWords(self, text: str, brokenLetters: str) -> int:
        s=text.split()
        bset=set(brokenLetters)
        num=0
        for word in s:
            if set(word).intersection(bset)==set():
                num+=1
        return num

【题5】2278. 字母在字符串中的百分比

2278. 字母在字符串中的百分比: 给你一个字符串 s 和一个字符 letter ,返回在 s 中等于 letter 字符所占的 百分比 ,向下取整到最接近的百分比。

题目解析: 确定给定字符letter在给定字符串中出现的频率。
解题思路: 计算给定字符在给定字符串中出现的次数,然后求出现的百分比。

class Solution:
    def percentageLetter(self, s: str, letter: str) -> int:
        nums=len(s)
        num = 0
        for i in range(nums):
            if letter==s[i]:
                num = num+1
        return floor(num/nums*100)
int percentageLetter(char * s, char letter){
    int num = 0;
    int nums = strlen(s);
    for(int i=0;i<nums;i++){
        if(letter==s[i]){
            num++;
        }
    }
    return num*100/nums;
}

【题6】551. 学生出勤记录 I

551. 学生出勤记录 I: 给你一个字符串 s 表示一个学生的出勤记录,其中的每个字符用来标记当天的出勤情况(缺勤、迟到、到场)。记录中只含下面三种字符:

‘A’:Absent,缺勤
‘L’:Late,迟到
‘P’:Present,到场
如果学生能够 同时 满足下面两个条件,则可以获得出勤奖励:

总出勤 计,学生缺勤(‘A’)严格 少于两天。
学生 不会 存在 连续 3 天或 连续 3 天以上的迟到(‘L’)记录。

如果学生可以获得出勤奖励,返回 true ;否则,返回 false 。

题目解析: 若学生在规定天数内缺勤次数少于两次并且连续迟到的次数少于3次则可获得出勤奖励,反之不能获得出勤奖励。
解题思路: 计算学生缺勤的次数,如果大于等于两次了,则不能获得出勤奖励;计算学生连续迟到的次数,如果连续迟到次数大于等于三次了则不能获得出勤奖励;否则可以获得奖励。

class Solution:
    def checkRecord(self, s: str) -> bool:
        #nums = len(s)
        numA = 0
        numL = 0
        #for i in range(nums):
        for i in s:
            #if s[i]=='A':
            if i=='A':
                numA = numA + 1
                if numA >= 2:
                    return False
            #if s[i]=='L':
            if i=='L':
                numL = numL + 1
                if numL>=3:
                    return False
            else:
                numL = 0
        return True
bool checkRecord(char * s){
    int numA=0;
    int numL=0;
    for(int i=0;i<strlen(s);i++){
        if(s[i]=='A'){
            numA++;
            if(numA>=2){
                return false;
            }
        }
        if(s[i]=='L'){
            numL++;
        }else{
            numL=0;
        }
        if(numL>=3){
            return false;
        }
    }
    return true;
}

【题7】2255. 统计是给定字符串前缀的字符串数目

2255. 统计是给定字符串前缀的字符串数目: 给你一个字符串数组 words 和一个字符串 s ,其中 words[i] 和 s 只包含 小写英文字母
请你返回 words 中是字符串 s 前缀字符串数目
一个字符串的 前缀 是出现在字符串开头的子字符串。子字符串 是一个字符串中的连续一段字符序列。

题目解析: 确定字符串数组words中的每个字符串是否为与给定字符串s字母正序顺序相同的s的子字符串的个数。
解题思路: 遍历字符串数组中的每个字符串,确定与参照字符串s的从属关系,若从属关系满足要求则计数器加1.

class Solution:
    def countPrefixes(self, words: List[str], s: str) -> int:
        num=0
        for word in words:
            length = len(word)
            if word==s[:length]:
                num+=1
            #for i in range(length):
                #if len(s)<length or word[i]!=s[i]:
                    #break
            #else:
                #num+=1
        return num

【题8】1071. 字符串的最大公因子

1071. 字符串的最大公因子: 对于字符串 s 和 t,只有在 s = t + … + t(t 自身连接 1 次或多次)时,我们才认定 “t 能除尽 s”。

给定两个字符串 str1 和 str2 。返回 最长字符串 x,要求满足 x 能除尽 str1 且 X 能除尽 str2 。

题目解析: 确定两个字符串str1 和 str2是否由共同的子字符串单元构成,若是返回这个子字符串单元;若不是则返回空字符串。
**解题思路:**寻找两个字符串长度的公约数。

class Solution:
    def gcdOfStrings(self, str1: str, str2: str) -> str:
        lenstr1 = len(str1)
        lenstr2 = len(str2)
        for i in range(min(lenstr1, lenstr2),0,-1):
            if lenstr1%i==0 and lenstr2%i==0:
                if str1[:i]*(lenstr1//i)==str1 and str1[:i]*(lenstr2//i)==str2:
                    return str1[:i]
        return ""

参考文献

  1. https://blog.csdn.net/WhereIsHeroFrom/article/details/124540763
  2. https://blog.csdn.net/WhereIsHeroFrom/article/details/125093767
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值