这里写目录标题
- 第一章 字符串相关问题II
-
- 1、Leetcode 387:字符串中的第一个唯一字符
- 2、Leetcode 8:字符串转换整数重写
- 3、Leetcode 541:反转字符串II重写
- 4、Leetcode 151:翻转字符串里的单词重写
- 5、Leetcode 537:反转字符串中的单词iii重写
- 6、Leetcode 917:仅反转字母重写
- 7、Leetcode 438:找到字符串中所有字母异位词重写
- 8、Leetcode 5:最长回文串重写
- 9、Leetcode 205:同构字符串
- 10、Leetcode 680:验证回文字符串II重写
- 11、Leetcode 44:通配符匹配重写
- 12、Leetcode 32:最长有效括号重写
- 13、Leetcode 115:不同的子序列重写
- 第二章 高级动态规划
- 第三章 布隆过滤器&LRU cache
- 第三章 位运算
第一章 字符串相关问题II
1、Leetcode 387:字符串中的第一个唯一字符
题目描述
解题思路
使用哈希表,key存储字符,value存储对应下标。
代码实现
class Solution:
def firstUniqChar(self, s: str) -> int:
#建立哈希表
dic=collections.defaultdict(list)
for i in range(len(s)):
dic[s[i]].append(i)
#遍历哈希表找到第一个次数为1的
for k,v in dic.items():
if len(v)==1:
return int(v[-1])
return -1
2、Leetcode 8:字符串转换整数重写
class Solution:
def myAtoi(self, s: str) -> int:
#对字符串左边的空格进行处理
slices=list(s.strip())
#如果为空,返回0
if len(slices)==0:
return 0
#先判断正负号
signal = -1 if slices[0]=="-" else 1
#将正负号删除
if slices[0] in ["-","+"]: del slices[0]
res,i=0,0
#开始循环
while i < len(slices) and slices[i].isdigit():
res=res*10+ord(slices[i])-ord("0")
i+=1
return max(min(2**31-1,res*signal),-2**31)
3、Leetcode 541:反转字符串II重写
class Solution:
def reverseStr(self, s: str, k: int) -> str:
n=len(s)
li=list(s)
for i in range(0,n,k*2):
li[i:i+k]=li[i:i+k][::-1]
return "".join(li)
4、Leetcode 151:翻转字符串里的单词重写
class Solution:
def reverseWords(self, s: str) -> str:
#切片
word_list=s.split()
word_list.reverse()
return " ".join(word_list)
5、Leetcode 537:反转字符串中的单词iii重写
class Solution:
def reverseWords(self, s: str) -> str:
n=len(s)
#切片
word_list=[list(word) for word in s.split()]
#遍历
res=[]
for word in word_list:
word.reverse()
res.append("".join(word))
return " ".join(res)
6、Leetcode 917:仅反转字母重写
class Solution:
def reverseOnlyLetters(self, S: str) -> str:
#将输入中纯字母的压栈
stack=[char for char in S if char.isalpha()]
#开始修改原始字符串
li=list(S)
for i in range(len(li)):
if S[i].isalpha():
new_char=stack.pop()
li[i]=new_char
else:
continue
return "".join(li)
7、Leetcode 438:找到字符串中所有字母异位词重写
class Solution:
def findAnagrams(self, s: str, p: str) -> List[int]:
#长度
m,n=len(s),len(p)
res=[]
#特殊条件
if m<n:
return []
#建立一个26位列表的映射
p_save=[0]*26
s_save=[0]*26
#对于s中的前n个数字进行添加
for i in range(n):
p_save[ord(p[i])-ord("a")]+=1
s_save[ord(s[i])-ord("a")]+=1
#判断
if p_save==s_save:
res.append(0)
#开始从下标为n开始遍历
for j in range(n,m):
#新添加的
s_save[ord(s[j])-ord("a")]+=1
#去除的
s_save[ord(s[j-n])-ord("a")]-=1
#判断
if s_save==p_save:
res.append(j-(n-1))
return res
8、Leetcode 5:最长回文串重写
class Solution:
def expand_valid(self,s,left,right):
while left>=0 and right<len(s) and s[left]==s[right]:
left-=1
right+=1
return left+1,right-1
def longestPalindrome(self, s: str) -> str:
start,end=0,0
for i in range(len(s)):
l1,r1=self.expand_valid(s,i,i)
l2,r2=self.expand_valid(s,i,i+1)
#判断
if r1-l1>end-start:
start,end=l1,r1
if r2-l2>end-start:
start,end