2022.05.18力扣刷题笔记(字符串基础题目:T125、T344、T557、T49)

先来考虑一下如何判断两个字符串的大小。

而对于两个不相等的字符串,我们可以以下面的规则定义两个字符串的大小:

  • 从两个字符串的第 0 个位置开始,依次比较对应位置上的字符编码大小(使用ord获取字符编码)。
    • 如果 str1[i] 对应的字符编码等于 str2[i] 对应的字符编码,则比较下一位字符。
    • 如果 str1[i] 对应的字符编码小于 str2[i] 对应的字符编码,则说明 str1 < str2。比如:"abc" < "acc"
    • 如果 str1[i] 对应的字符编码大于 str2[i] 对应的字符编码,则说明 str1 > str2。比如:"bcd" > "bad"
  • 如果比较到某一个字符串末尾,另一个字符串仍有剩余:
    • 如果字符串 str1 的长度小于字符串 str2,即 len(str1) < len(str2)。则 str1 < str2。比如:"abc" < "abcde"
    • 如果字符串 str1 的长度大于字符串 str2,即 len(str1) > len(str2)。则 str1 > str2。比如:"abcde" > "abc"
  • 如果两个字符串每一个位置上的字符对应的字符编码都相等,且长度相同,则说明 str1 == str2,比如:"abcd" == "abcd"

按照上面的规则,我们可以定义一个 strcmp 方法,并且规定:

  • 当 str1 < str2 时,strcmp 方法返回 -1
  • 当 str1 == str2 时,strcmp 方法返回 0
  • 当 str1 > str2 时,strcmp 方法返回 1

strcmp 方法对应的具体代码如下:

def strcmp(str1, str2):
    index1, index2 = 0, 0
    while index1 < len(str1) and index2 < len(str2):
        if ord(str1[index1]) == ord(str2[index2]):
            index1 += 1
            index2 += 1
        elif ord(str1[index1]) < ord(str2[index2]):
            return -1
        else:
            return 1
    
    if len(str1) < len(str2):
        return -1
    elif len(str1) > len(str2):
        return 1
    else:
        return 0

T125:验证回文串 ——

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

说明:本题中,我们将空字符串定义为有效的回文串。

class Solution:
    def isPalindrome(self, s: str) -> bool:
        s=s.lower()#忽略字母大小写,干脆全部转成小写,也方便比较
        for a in s:
            '''
            只考虑(小写)字母和数字字符
            数字和小写字母的Unicode取值范围分别是[48,57],[97,122]
            把不是数字和小写字母的字符都删去
            '''
            if ord(a)<48 or 57<ord(a)<97 or ord(a)>122:
                s=s.replace(a,'')
        b=s[::-1]#切片逆序排列
        for i in range(len(s)):
            if s[i]!=b[i]:
                return bool(0)
        return bool(1)

示例1

输入: "A man, a plan, a canal: Panama"
输出: true
解释:"amanaplanacanalpanama" 是回文串

示例2

输入: "race a car"
输出: false
解释:"raceacar" 不是回文串

T344:反转字符串——

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

来源:力扣(LeetCode)链接:https://leetcode.cn/problems/reverse-string

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        a=[]
        for i in range(len(s)):
            a.append(s[len(s)-i-1])
        for i in range(len(s)):
            s[i]=a[i]

T557:反转字符串中的单词3—— 给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。

class Solution:
    def reverseWords(self, s: str) -> str:
        a=s.split()
        b=a[0][::-1]
        for i in range(1,len(a)):
            b=b+' '+a[i][::-1]
        return b

示例1

输入:s = "Let's take LeetCode contest"
输出:"s'teL ekat edoCteeL tsetnoc"

示例2

输入: s = "God Ding"
输出:"doG gniD"

T49:字母易位词分组——

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。

来源:力扣(LeetCode)链接:https://leetcode.cn/problems/group-anagrams
这题想了半天不太会,看了官方解答的答案,主要还是昨天有关哈希表(python里的字典)的应用不够熟练

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        a=collections.defaultdict(list)
        '''
        使用了collections模块之defaultdict
        下面是它的解释和用法:
        Python中通过Key访问字典,当Key不存在时,会引发‘KeyError’异常。
        为了避免这种情况的发生,可以使用collections类中的defaultdict()方法来为字典提供默认值
        比如下面的a[key].append(s),如果不提供默认值,字典里面没有key和它对应的value会报错,更别说键值对的缺失了
        那么使用了collections模块之defaultdict之后,没有这个key就添加这个key,value默认是一个空的list
        '''
        for s in strs:
            key=''.join(sorted(s))
            a[key].append(s)
        return list(a.values())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值