2024.3.20力扣刷题记录-字符串练习1

一、520. 检测大写字母

1.函数

class Solution:
    def detectCapitalUse(self, word: str) -> bool:
        # 函数
        return True if word == word.upper() or word == word.capitalize() or word == word.lower() else False
        # capitalize()  首字母大写
        # title()       标题式 多个单词,单词首字母大写
        # swapcase()    大小写转换

还有看到另外的函数写法,来自题解(. - 力扣(LeetCode))。代码如下:

class Solution:
    def detectCapitalUse(self, word: str) -> bool:
        # 函数2
        return word.islower() or word.isupper() or word.istitle()

2.模拟

方法参考官方题解(. - 力扣(LeetCode))。当字符串长为一时,无论大小写,均满足条件。如果第一个字母大写,则后面的大小写统一,即和第二个字符大小写一样;如果第一个字母小写,则后面均需小写。代码如下:

class Solution:
    def detectCapitalUse(self, word: str) -> bool:
        # 模拟
        # islower(),isupper()函数
        if len(word) == 1:
            return True
        if word[0].islower():
            return all(word[i].islower() for i in range(1,len(word)))
        else:
            return all(word[i].islower() == word[1].islower() for i in range(1,len(word)))

二、125. 验证回文串

不会去掉其他字符,以下方法均来自官方题解(. - 力扣(LeetCode))。

1.筛选+判断

class Solution:
    def isPalindrome(self, s: str) -> bool:
        # 筛选+判断
        ss = ''.join(c.lower() for c in s if c.isalnum())
        return ss == ss[::-1]

来自chatgpt:

isalnum()用于检查字符串是否只包含字母和数字字符。

其他类似函数:

  1. isalpha():检查字符串是否只包含字母字符。
  2. isdigit():检查字符串是否只包含数字字符。
  3. isspace():检查字符串是否只包含空白字符(空格、制表符、换行符等)。

2.筛选+双指针

class Solution:
    def isPalindrome(self, s: str) -> bool:
        # 筛选+双指针
        ss = ''.join(c.lower() for c in s if c.isalnum())
        left,right = 0,len(ss)-1
        while left < right:
            if ss[left] != ss[right]:
                return False
            left += 1
            right -= 1
        return True

 3.不筛选+双指针

class Solution:
    def isPalindrome(self, s: str) -> bool:
        # 不筛选+双指针
        # 时复O(n)
        n = len(s)
        left,right = 0,n-1
        while left < right:
            while left < right and not s[left].isalnum():
                left += 1
            while left < right and not s[right].isalnum():
                right -= 1
            if s[left].lower() != s[right].lower():
                return False
            left += 1
            right -= 1
        return True

三、14. 最长公共前缀

1.遍历,不断更新ans。(也就是横向扫描)。

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        # 遍历
        ans = strs[0]
        for i in range(1,len(strs)):
            s = strs[i]
            j = 0
            while j < min(len(ans),len(s)):
                if ans[j] != s[j]:
                    break
                j += 1
            ans = ans[:j]
        return ans

参考官方题解(. - 力扣(LeetCode)),对上述代码进行优化:

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        # 遍历-横向扫描
        ans = strs[0]
        for i in range(1,len(strs)):
            s = strs[i]
            j = 0
            while j < min(len(ans),len(s)) and ans[j] == s[j]:
                j += 1
            ans = ans[:j]
            if ans == '':   #优化
                break
        return ans

2.纵向扫描,代码来自官方题解。

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        # 纵向扫描
        if not strs:
            return ""
        
        length, count = len(strs[0]), len(strs)
        for i in range(length):     #遍历字符
            c = strs[0][i]
            if any( i == len(strs[j]) or strs[j][i] != c for j in range(1,count) ):
                return strs[0][:i]
        
        return strs[0]

四、434. 字符串中的单词数

1.拆分+列表

class Solution:
    def countSegments(self, s: str) -> int:
        # 拆分+列表
        return len(s.split())

2.遍历,方法来自题解(. - 力扣(LeetCode))。

class Solution:
    def countSegments(self, s: str) -> int:
        # 遍历
        ans = 0
        for i,c in enumerate(s):
            if c != ' ' and (i == 0 or s[i-1] == ' '):
                ans += 1
        return ans

3.巧妙遍历(升级版),方法来自题解(. - 力扣(LeetCode))。

class Solution:
    def countSegments(self, s: str) -> int:
        # 巧妙遍历
        ans = 0
        s += ' '
        for i in range(1,len(s)):
            if s[i] == ' ' and s[i-1] != ' ':
                ans += 1
        return ans

感谢你看到这里!一起加油吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值