leetcode字符串(python)

字符串常用函数:

str.split(str="", num=string.count(str))

Python split() 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串

2、

join  ' '.join(str),用‘’内指定字符将str相连。

3.字符串本身不能用列表的形式改变

s = "  hello world!  "
s = list(s) #记录这个用法
print(s)

>> [' ', ' ', 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!', ' ', ' ']

3. 无重复字符的最长子串

https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/hua-dong-chuang-kou-by-powcai/

这道题主要用到思路是:滑动窗口

什么是滑动窗口?

其实就是一个队列,比如例题中的 abcabcbb,进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满足要求。所以,我们要移动这个队列!

如何移动?我们只要把队列的左边的元素移出就行了,直到满足题目要求!一直维持这样的队列,找出队列出现最长的长度时候,求出解!

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        left = 0
        max_len = 0 #当取最大时,一定会设置两个变量,当前值和当前最大值
        cur_len = 0
        lookup = set() #建立集合,如果集合内已有该元素,元素个数不变(并集)add添加,删除用remove
        s_len = len(s)
        for i in range(s_len):
            cur_len += 1
            while s[i] in lookup:
                lookup.remove(s[left])
                left += 1
                cur_len -= 1
            if cur_len > max_len: max_len = cur_len
            lookup.add(s[i])
        return max_len

 

5. 最长回文子串

https://leetcode-cn.com/problems/longest-palindromic-substring/solution/zhong-xin-kuo-san-dong-tai-gui-hua-by-liweiwei1419/

这位大佬写的很棒,尤其是动态规划法,但针对这题最好的方法还是中心扩散法。

我分别用暴力法,动态规划和中心扩散法,代码如下:

#暴力法 这篇文章是为中级读者而写的。它介绍了回文,动态规划以及字符串处理。请确保你理解什么是回文。回文是一个正读和反读都相同的字符串,例如,“aba” 是回文
# class Solution:
#     def longestPalindrome(self, s: str) -> str:
#         if s==s[::-1]:
#             return s
#         max_len = 1
#         res = s[0]
#         for i in range(len(s) - 1):
#             for j in range(i + 1, len(s)):
#                 if j - i + 1 > max_len and s[i:j+1] == s[i:j+1][::-1]:
#                     max_len = j - i + 1
#                     res = s[i:j + 1]
#         return res
#时间复杂度:O(n^2),往往利用python的切片可以很好的缩减复杂度

#动态规划方法
# class Solution:
#     def longestPalindrome(self, s: str) -> str:
#         #特例
#         size = len(s)
#         if len(s) < 2:
#             return s
        
#         start = 0
#         max_len = 1
#         #定义状态
#         dp = [[False for _ in range(size)] for _ in range(size)]
#         #初始化
#         for i in range(size):
#             dp[i][i] = True
#         #状态转移
#         for j in range(1, size):
#             for i in range(0, j):
#                 if s[i] == s[j]:
#                     if j - i < 3: #aba,cdc都是true
#                         dp[i][j] = True
#                     else:
#                         dp[i][j] = dp[i+1][j-1] 
#                 else:
#                     dp[i][j] = False
                
#                 if dp[i][j] == True:
#                     cur_len = j - i + 1
#                     if cur_len > max_len:
#                         start = i
#                         max_len = cur_len
#                 # print(max_len)
#         return s[start:start + max_len]

#中心扩散法 时间复杂度为o(n2),空间复杂度为o(n1)
class Solution:
    def longestPalindrome(self, s: str) -> str:
        def center_spread(s, size, left, right):
            i = left
            j = right
            while i >= 0 and j < size and s[i] == s[j]:
                i -= 1
                j += 1
            return s[i+1: j], j - i - 1
        max_len = 1
        size = len(s)
        
        if size < 2:
            return s
        res = s[0]    #注意这个位置要放在判断之后,如果放在之前会报错,eg当s=''时,不存在s[0] 
        for i in range(size):
            odd_str, odd_len = center_spread(s, size, i, i)
            even_str, even_len = center_spread(s, size, i, i+1)
            cur_max_str = odd_str if odd_len > even_len else even_str
            if len(cur_max_str) > max_len:
                max_len = len(cur_max_str)
                res = cur_max_str
        return res
#参考链接https://leetcode-cn.com/problems/longest-palindromic-substring/solution/zhong-xin-kuo-san-dong-tai-gui-hua-by-liweiwei1419/

6. Z 字形变换

理解题意:https://leetcode-cn.com/problems/zigzag-conversion/solution/6-z-zi-xing-bian-huan-c-c-by-bian-bian-xiong/ 

掌握方法:https://leetcode-cn.com/problems/zigzag-conversion/solution/zzi-xing-bian-huan-by-jyd/

思路:

#按着z的方向,每次都是第一行到最后一行,然后从最后一行到第一行,再转向,因此我们定义转向flag,res存每行的字符,最后在用join连接起来。

class Solution:
    def convert(self, s: str, numRows: int) -> str:
        if numRows < 2:
            return s

        res = ['' for _ in range(numRows)]
        i, flag = 0, -1
        for c in s:
            res[i] += c
            if i == 0 or i == numRows - 1:flag = -flag
            i += flag
        return ''.join(res)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
题目描述: 请你来实现一个 atoi 函数,使其能将字符串转换成整数。该函数需要丢弃无用的开头空格,找到第一个非空格字符,然后将其后面的字符(如果符合要求的话)转换成整数,如果第一个非空字符为正或者负号时,将该符号与后面尽可能多的连续数字组合起来,返回整数。如果第一个非空字符是非数字字符或者一开始没有给定任何数字,则返回 0。 注意: 假如只能存储有限的整数范围内,例如32位整数,则请返回 INT_MAX(231 − 1)或 INT_MIN(−231)。 示例: 输入: "42" 输出: 42 输入: " -42" 输出: -42 解释: 第一个非空白字符为 '-', 它是一个负号。我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。 输入: "4193 with words" 输出: 4193 解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。 输入: "words and 987" 输出: 0 解释: 第一个非空字符是 'w', 但它不是数字或正、负号。因此无法执行有效的转换。 输入: "-91283472332" 输出: -2147483648 解释: 数字 "-91283472332" 超过 32 位有符号整数范围。因此返回 INT_MIN(−231)。 解题思路: 这道题比较繁琐,需要注意的地方很多,需要仔细考虑每一种情况。下面是一种比较清晰的思路: 1. 删除字符串前面的空格。 2. 判断第一个非空字符是否为正负号或数字,如果是数字则开始转换,否则直接返回0。 3. 转换过程中如果遇到非数字字符,则停止转换,返回当前已转换的数字。 4. 判断转换后的数字是否超出了32位有符号整数的范围,如果超出了则返回对应的极值。 代码实现: ```python class Solution: def myAtoi(self, str: str) -> int: # 删除字符串前面的空格 str = str.lstrip() # 判断第一个非空字符是否为正负号或数字 if not str or (not str[0].isdigit() and str[0] not in ['+', '-']): return 0 # 转换过程中如果遇到非数字字符,则停止转换 i = 1 while i < len(str) and str[i].isdigit(): i += 1 # 转换数字 num_str = str[:i] sign = -1 if num_str[0] == '-' else 1 num = 0 for c in num_str: if c.isdigit(): num = num * 10 + int(c) else: break # 判断转换后的数字是否超出了32位有符号整数的范围 max_int = 2**31 - 1 min_int = -2**31 num = num * sign if num > max_int: return max_int elif num < min_int: return min_int else: return num ``` 时间复杂度:$O(n)$,其中 $n$ 是字符串的长度。需要对字符串进行一次遍历。 空间复杂度:$O(1)$。除了常量空间之外,不需要额外的空间。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值