Leetcode:字符串问题ii

第一章 字符串相关问题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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值