classSolution:deflongestPalindrome(self, s:str)->str:
n =len(s)# 字符串长度if n <2:# 如果字符串长度小于2,直接返回字符串本身return s
# 创建一个包含 n 行的列表,每行包含 n 个元素,每个元素都是 False
dp =[[False]* n for _ inrange(n)]# 创建一个二维数组,用于存储子串是否为回文串的状态
start, max_len =0,1# 记录最长回文子串的起始位置和长度,默认为第一个字符和长度为1# 初始化长度为1和2的回文子串for i inrange(n):
dp[i][i]=Trueif i < n -1and s[i]== s[i +1]:
dp[i][i +1]=True
start = i
max_len =2# 从长度为3开始遍历,更新状态数组dpfor length inrange(3, n +1):for i inrange(n - length +1):
j = i + length -1# 子串的结束位置if s[i]== s[j]and dp[i +1][j -1]:# 如果子串两端字符相等且去掉两端字符后仍为回文串
dp[i][j]=True
start = i # 更新最长回文子串的起始位置
max_len = length # 更新最长回文子串的长度# start 是子串的起始索引。# start + max_len 是子串的结束索引(不包括该索引对应的字符)。# 因此,s[start:start + max_len] 表示从字符串 s 中提取子串,起始索引为 start,结束索引为 start + max_len - 1,# 即提取了从 start 开始到 start + max_len - 1(包括起始索引,不包括结束索引)的子串。return s[start:start + max_len]# 返回最长回文子串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
6
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
思路
classSolution:defconvert(self,s:str,numRows:int)->str:if numRows<2:return s
# res 列表的长度是 numRows,并且每个元素都是一个空字符串,这种初始化通常用于后续填充数据的数据结构的准备工作。
res=[""for _ inrange(numRows)]
i,flag=0,-1for c in s:
res[i]+=c
if i==0or i==numRows-1: flag=-flag
i+=flag
return"".join(res)# 将列表 res 中的所有字符串连接成一个单独的字符串,并返回这个字符串if __name__=="__main__":
s="LEETCOD"
numRows=3
solution=Solution()print(solution.convert(s,numRows))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
7
defreverse_force(x:int)->int:# ->int表示返回值是intif-10<x<10:return x
str_x=str(x)if str_x[0]!="-":# [::-1] 表示从字符串的末尾到开头,以步长 -1 的方式取字符串的所有字符,相当于将字符串进行翻转
str_x=str_x[::-1]
x=int(str_x)else:# [:0:-1] 表示从字符串的倒数第二个字符开始(索引为 -2),到字符串的第一个字符(索引为 0)之前结束(不包括索引为 0 的字符)。# -1 表示从右向左逆序取字符串。
str_x=str_x[:0:-1]
x=int(str_x)
x=-x
# 如果 x 在区间 -2147483648 到 2147483647 之间,就返回 x 的值,否则返回 0。return x if-2147483648< x <2147483647else0if __name__=="__main__":
x=reverse_force(123)print(x)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
8 字符串转换成整数
classSolution:defmyAtoi(self, s:str)->int:
s = s.strip()# 删除首尾空格ifnot s:return0# 字符串为空则直接返回
res, i, sign =0,1,1
int_max, int_min, bndry =2**31-1,-2**31,2**31//10if s[0]=='-': sign =-1# 保存负号elif s[0]!='+': i =0# 若无符号位,则需从 i = 0 开始数字拼接# 从索引 i 开始直到字符串末尾的所有字符。for c in s[i:]:ifnot'0'<= c <='9':break# 遇到非数字的字符则跳出# 假设 int_max 是 2147483647,那么 bndry 就是 214748364。现在,假设 res 当前是 214748364,而下一个字符 c 是 '8'。# 如果我们尝试将 '8' 加入 res 中,那么 res 就会变成 2147483648,这个数已经超出了 int_max 的范围。if res > bndry or res == bndry and c >'7':return int_max if sign ==1else int_min # 数字越界处理# ord(c) 返回字符 c 的 ASCII 码值,因为数字字符的 ASCII 码值是连续的,因此可以通过减去 '0' 的 ASCII 码值来得到对应数字的值。
res =10* res +ord(c)-ord('0')# 数字拼接return sign * res
if __name__=="__main__":
sl=Solution()
x=sl.myAtoi("4193 with words")print(x)