力扣-初级算法-字符串

1.Python字符串处理操作方法

  • len(s):返回字符串 s 的长度。
    
  • s.lower():将字符串 s 转换为小写。
    
  • s.upper():将字符串 s 转换为大写。
    
  • s.capitalize():将字符串 s 的第一个字母大写,其余字母小写。
    
  • s.title():将字符串 s 中每个单词的首字母大写。
    
  • s.swapcase():将字符串 s 中大写字母转为小写,小写字母转为大写。
    
  • s.find(sub):返回子串 sub 在字符串 s 中第一次出现的位置,没有找到返回 -1。
    
  • s.rfind(sub):返回子串 sub 在字符串 s 中最后一次出现的位置,没有找到返回 -1。
    
  • s.index(sub):与 find() 类似,但如果没有找到子串 sub,则抛出 ValueError 异常。
    
  • s.replace(old, new):将字符串 s 中的所有 old 子串替换为 new。
    
  • s.split(sep):将字符串 s 按照分隔符 sep 分割成一个列表。如果不指定 sep,默认按空格分割。
    
  • s.rsplit(sep):从右侧开始分割字符串。
    
  • s.splitlines():按行分割字符串。
    
  • sep.join(iterable):将可迭代对象 iterable 中的元素用字符串 sep 连接成一个新字符串。
    
  • s.strip():去除字符串 s 两端的空白字符。
    
  • s.lstrip():去除字符串 s 左侧的空白字符。
    
  • s.rstrip():去除字符串 s 右侧的空白字符。
    
  • s.startswith(prefix):检查字符串 s 是否以 prefix 开头。
    
  • s.endswith(suffix):检查字符串 s 是否以 suffix 结尾。
    
  • s.isalpha():检查字符串 s 是否只包含字母。
    
  • s.isdigit():检查字符串 s 是否只包含数字。
    
  • s.isalnum():检查字符串 s 是否只包含字母和数字。
    
  • s.isspace():检查字符串 s 是否只包含空白字符。
    
  • s.format(*args, **kwargs):使用 args 和 kwargs 中的值格式化字符串 s。
    
  • f"{var}":使用 f-string 格式化字符串。
    
  • s.encode(encoding):将字符串 s 编码为字节对象。
    
  • b.decode(encoding):将字节对象 b 解码为字符串。
    

2.算法题

2.1 反转字符串

题目

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

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

示例

输入:s = [“h”,“e”,“l”,“l”,“o”]
输出:[“o”,“l”,“l”,“e”,“h”]

解法
class Solution(object):
    def reverseString(self, s):
        """
        :type s: List[str]
        :rtype: None Do not return anything, modify s in-place instead.
        """
        s.reverse()
分析
  • 时间复杂度:O(N)
  • 空间复杂度:O(1)

2.2 整数翻转

题目

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。

示例

输入:x = -123
输出:-321

解法
class Solution(object):
    def reverse(self, x):
        """
        :type x: int
        :rtype: int
        """
        str_x = str(x)
        if str_x[0] == '-':
            reversed_str = '-'+str_x[:0:-1]
        else:
            reversed_str = str_x[::-1]
        y = int(reversed_str)
        if y < -2**31 or y > 2**31 - 1:
            return 0
        return y
分析
  • 时间复杂度:O(N)
  • 空间复杂度:O(N)

2.3 字符串中的第一个唯一字符

题目

给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。

示例

输入: s = “loveleetcode”
输出: 2

解法
class Solution(object):
    def firstUniqChar(self, s):
        """
        :type s: str
        :rtype: int
        """
        l = len(s)
        for x in 'abcdefghijklmnopqrstuvwxyz':
            k1 = s.find(x)
            k2 = s.rfind(x)
            if k1==k2 and k1!=-1:
                l=min(k1,l)
        return l if l !=len(s) else -1
分析
  • 时间复杂度:O(N)
  • 空间复杂度:O(1)

2.4 有效的字母异位词

题目

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

示例

输入: s = “anagram”, t = “nagaram”
输出: true

解法
class Solution(object):
    def isAnagram(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: bool
        """
        d1 = {}
        d2 = {}
        for i in s:
            if i in d1:
                d1[i]+=1
            else:
                d1[i]=1
        for j in t:
            if j in d2:
                d2[j]+=1
            else:
                d2[j]=1
        d1=dict(sorted(d1.items()))#sorted()方法需要一个可迭代对象,但是字典本身不可迭代,需要用items()方法返回一个可迭代的对象,每个元素是(key,value)元组
        d2=dict(sorted(d2.items()))
        return True if d1==d2 else False
分析
  • 时间复杂度:O(N)
  • 空间复杂度:O(N)

2.5 验证回文串

题目

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。

字母和数字都属于字母数字字符。

给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 。

示例

输入: s = “A man, a plan, a canal: Panama”
输出:true
解释:“amanaplanacanalpanama” 是回文串。

解法
class Solution(object):
    def isPalindrome(self, s):
        """
        :type s: str
        :rtype: bool
        """
        l1 = [c.lower() for c in s if c.isalnum()]
        return l1 ==l1[::-1]
  • 时间复杂度:O(N)
  • 空间复杂度:O(N)

2.6 字符串转换整数 (atoi)

题目

请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数。

函数 myAtoi(string s) 的算法如下:

空格:读入字符串并丢弃无用的前导空格(" ")
符号:检查下一个字符(假设还未到字符末尾)为 ‘-’ 还是 ‘+’。如果两者都不存在,则假定结果为正。
转换:通过跳过前置零来读取该整数,直到遇到非数字字符或到达字符串的结尾。如果没有读取数字,则结果为0。
舍入:如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被舍入为 −231 ,大于 231 − 1 的整数应该被舍入为 231 − 1 。
返回整数作为最终结果。

示例

输入:s = “1337c0d3”

输出:1337

解释:

第 1 步:“1337c0d3”(当前没有读入字符,因为没有前导空格)
^
第 2 步:“1337c0d3”(当前没有读入字符,因为这里不存在 ‘-’ 或者 ‘+’)
^
第 3 步:“1337c0d3”(读入 “1337”;由于下一个字符不是一个数字,所以读入停止)
^

解法
class Solution(object):
    def myAtoi(self, s):
        """
        :type s: str
        :rtype: int
        """
        s = s.lstrip()
        if not s:return 0
        sign=1
        if s[0]=='-':
            sign=-1
            s=s[1:]
        elif s[0]=='+':
            s=s[1:]   
        res=0
        for e in s:
            if not e.isdigit():break
            else:
                res = res*10+int(e)
        res = res*sign
        min_int = -2**31
        max_int = 2**31-1
        if res<min_int:return min_int
        elif res>max_int:return max_int
        return res
分析
  • 时间复杂度:O(N)
  • 空间复杂度:O(N)

2.7 实现 strStr()

题目

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。

示例

输入:haystack = “sadbutsad”, needle = “sad”
输出:0
解释:“sad” 在下标 0 和 6 处匹配。
第一个匹配项的下标是 0 ,所以返回 0 。

解法
class Solution(object):
    def strStr(self, haystack, needle):
        """
        :type haystack: str
        :type needle: str
        :rtype: int
        """
        return haystack.find(needle)
分析
  • 时间复杂度:O(N)
  • 空间复杂度:O(1)

2.8 外观数列

题目

「外观数列」是一个数位字符串序列,由递归公式定义:

countAndSay(1) = “1”
countAndSay(n) 是 countAndSay(n-1) 的行程长度编码。
行程长度编码(RLE)是一种字符串压缩方法,其工作原理是通过将连续相同字符(重复两次或更多次)替换为字符重复次数(运行长度)和字符的串联。例如,要压缩字符串 “3322251” ,我们将 “33” 用 “23” 替换,将 “222” 用 “32” 替换,将 “5” 用 “15” 替换并将 “1” 用 “11” 替换。因此压缩后字符串变为 “23321511”。

给定一个整数 n ,返回 外观数列 的第 n 个元素。

示例

输入:n = 4

输出:“1211”

解释:

countAndSay(1) = “1”

countAndSay(2) = “1” 的行程长度编码 = “11”

countAndSay(3) = “11” 的行程长度编码 = “21”

countAndSay(4) = “21” 的行程长度编码 = “1211”

解法1
class Solution:
    def countAndSay(self, n):
        """
        :type n: int
        :rtype: str
        """
        if n == 1:
            return "1"
        current = "1"
        for _ in range(2, n + 1):
            next_seq = ''
            c = 1
            for i in range(1, len(current)):
                if current[i] == current[i - 1]:
                    c += 1
                else:
                    next_seq += str(c) + current[i - 1]
                    c = 1
            next_seq += str(c) + current[-1]
            current = next_seq
        return current

分析
  • 时间复杂度: O ( 2 n ) O(2^n) O(2n)
  • 空间复杂度: O ( 2 n ) O(2^n) O(2n)
解法2
class Solution:
    def countAndSay(self, n: int) -> str:
        if n == 1:
            return '1'
        current = '1'
        for _ in range(2, n + 1):
            result = []
            start, end = 0, 0
            while end < len(current):
                while end < len(current) and current[start] == current[end]:
                    end += 1
                result.append(str(end - start))
                result.append(current[start])
                start = end
            current = ''.join(result)
        return current
分析
  • 时间复杂度: O ( 2 n ) O(2^n) O(2n)
  • 空间复杂度: O ( 2 n ) O(2^n) O(2n)

2.9 最长公共前缀

题目

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 “”。

示例

输入:strs = [“flower”,“flow”,“flight”]
输出:“fl”

解法1
class Solution(object):
    def longestCommonPrefix(self, strs):
        """
        :type strs: List[str]
        :rtype: str
        """
        if not strs:
            return ""
        prefix = strs[0]
        for s in strs[1:]:
            while not s.startswith(prefix):
                prefix = prefix[:-1]
                if not prefix:
                    return ""
        return prefix
分析
  • 时间复杂度:O(N+M)
  • 空间复杂度:O(1)
解法2
class Solution(object):
    def longestCommonPrefix(self, strs):
        """
        :type strs: List[str]
        :rtype: str
        """
        if not strs:
            return ""
        strs.sort()
        n=len(strs)
        a=strs[0]     
        b=strs[n-1]
        res=""
        for i in range(len(a)):
            if i<len(b) and a[i]==b[i]:
                res+=a[i]
            else:
                break
        return res        
分析
  • 时间复杂度:O(N*LOGN+M)
  • 空间复杂度:O(N)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值