首页 > 编程语言 >吴师兄学算法day07 双指针 680. 验证回文串 II

吴师兄学算法day07 双指针 680. 验证回文串 II

时间:2024-01-15 21:01:05浏览次数:41  
标签:high right return day07 II 索引 low 680 left

题目:680. 验证回文串 II

易错点:

  • s[1:3] 是左闭右开

我的第一次代码:

class Solution(object):
    def validPalindrome(self, s):
        """
        :type s: str
        :rtype: bool
        """
        isPalindrome = lambda x: x == x[::-1]
        left, right = 0, len(s) - 1
        while left <= right:
            if s[left] == s[right]:
                left += 1
                right -= 1
            else:   # 如果不相等 就要移除1位
                # 当指针来到 位置[1:3] 只包括1,2,3
                # 如果移除左侧的1,对应的s[2:4],包含2,3 # python是左开右闭的
                # 如果移除右边的3,对应的s[1:3],包含1,2 # python是取前不取后
                return isPalindrome(s[left + 1: right + 1]) or isPalindrome(s[left: right])
        return True

我的第二次代码:

class Solution:
    def validPalindrome(self, s: str) -> bool:
        ishelp = lambda x : x==x[::-1]
        
        left = 0    
        right = len(s) -1
        while left < right:
            if s[left] == s[right]:
                left +=1
                right -=1
            else:
                # 去掉左边 | 去掉右边 # 因为本身s[1:3]就是左闭右开,本身就没包含右侧
                ans = ishelp(s[left+1:right+1]) or ishelp(s[left:right])
                return ans
        return True

大佬的代码:

class Solution(object):
    def validPalindrome(self, s):
        """
        :type s: str
        :rtype: bool
        """
        isPalindrome = lambda x : x == x[::-1]
        left, right = 0, len(s) - 1
        while left <= right:
            if s[left] == s[right]:
                left += 1
                right -= 1
            else:
                return isPalindrome(s[left + 1 : right + 1]) or isPalindrome(s[left: right])
        return True

作者:负雪明烛
链接:https://leetcode.cn/problems/valid-palindrome-ii/solutions/252740/cong-liang-ce-xiang-zhong-jian-zhao-dao-bu-deng-de/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

老师的代码:

class Solution:
    def validPalindrome(self, s: str) -> bool:

        # 判断 [ low , hight ] 这个区间的字符串是否是回文串
        def isPalindrome(low, high):

            # 左边索引的位置在 low 开始 
            left = low

            # 右边索引的位置在 high
            right = high

            # 两个索引向内移动
            # left 向右移动
            # right 向左移动
            while left < right:
                
                # 判断这两个元素值是否相同
                if s[left] != s[right]:
                    # 如果不同,直接返回 False
                    return False
                    
                # 否则,left 向右移动
                left += 1
                # right 向左移动
                right -= 1

            # 返回结果
            return True

        # 左边索引的位置在 0 开始 
        low = 0
        
        # 右边索引的位置在 len(s) - 1
        high = len(s) - 1

        # 两个索引向内移动
        # left 向右移动
        # right 向左移动
        while low < high:

            # 1、判断这两个元素值是否相同
            # 如果相同
            if s[low] == s[high]: 

                # 两个索引向内移动
                low += 1

                high -= 1

            # 2、如果不相同
            else:
                # 3、删除 low 所在这个元素,判断 [ low + 1 , high ] 是否是回文串
                # 或者
                # 4、删除 high 所在这个元素,判断 [ low  , high - 1 ] 是否是回文串
                return isPalindrome(low + 1, high) or isPalindrome(low, high - 1)
        
        # 返回结果
        return True

总结:

  • 老师的代码,手写的,更符合直觉。没有借用s[left: right] 本身的左闭右开的性质。
  • 大佬写的更简洁,需要有一定理解,以及lambda x : 写法, 还有注意有s[1:3]左闭右开的属性。
  • 无他,唯熟尔。多练习就好了。
  • 累了就歇一会,只要在路上就好。

参考:

https://r07na4yqwor.feishu.cn/docx/XoOfd8yZ3o6pSuxS2dTck2lgnjf

标签:high,right,return,day07,II,索引,low,680,left
From: https://www.cnblogs.com/liqi175/p/17966313

相关文章

  • IIC:DDM_SFP光模块参数读取
    光模块数字诊断监控数据读取逻辑报告I2C从设备地址0xA2访问的256字节的数据包括一些常量,也包含一些只读的变量,甚至还有一些可写的变量。数字诊断内存映射专用数据字段描述如下: 图1期间地址分布说明 图2检测信号地址 Finisar公司的DDM数据位于器件地址A2H,具体信号数据......
  • 吴师兄学算法day07 11. 盛最多水的容器
    题目:11. 盛最多水的容器难点:如何确定,每次只移动最短边,因为无论移动哪边的柱子,下面的底部一定是缩短的,剩下的就是取决于高度。如果移动的是,两侧高的那个,整体的面积一定是缩小的。如果移动的是,两侧底的那个,后面的柱子有可能是遇到高的,也有可能是低的,所以,整体面积可能大,也可......
  • 吴师兄学算法day07 167. 两数之和 II - 输入有序数组
    题目:167. 两数之和II-输入有序数组易错点:下标为1开始我的代码:classSolution:deftwoSum(self,numbers:List[int],target:int)->List[int]:right=len(numbers)-1left=0whileleft<right:ans=numbers[left]......
  • IIS实现负载均衡,通过ARR和URL重写
    目录一、实现整体方式介绍 二、配置负载均衡服务 三、把请求转发到负载均衡器 回到顶部一、实现整体方式介绍项目中部署在windows服务器上的项目,需要部署负载均衡,本来想用nginx来配置的,奈何iis上有几个项目,把80端口和443端口占用了,nginx就用不了了(因为通过域名访......
  • 吴师兄学算法day07 双指针 125. 验证回文串
    题目:125. 验证回文串易错点:isaplha()isdigit()lower()要熟悉,挺有用的。我的代码:classSolution:defisPalindrome(self,s:str)->bool:ans=''foriins:ifi.isalpha()ori.isdigit():ans+=i.lower()#......
  • IIC
    IIC读写EEPROM1、EEPROM字节写:起始信号,从机地址,R/W,ACK,写入地址,数据,ACK,停止信号页写:在写入地址处进行连续的写入数据,不需要每次发送写入地址(1页是8byte,当写入数据的大小超过8byte后会从头开始写入)当前地址读:EEPROM内部有指针,从当前指针所指的位置读取数据随机读:起始信号,从机地......
  • 吴师兄学算法day07 双指针 9. 回文数
    题目:9. 回文数易错点:右指针要记得移动我的代码:classSolution:defisPalindrome(self,x:int)->bool:array=list(str(x))right=len(array)-1forleftinrange(len(array)//2):ifarray[left]==array[right]:......
  • [刷题班] LeetCode80. 删除有序数组中的重复项II
    题目描述思路:快慢指针slow指针指向已经处理元素的下一个位置因为数组有序,如果nums[fast]==nums[slow-2],那么nums[fast]肯定等于nums[slow-1],那么此时这个数就出现了三次。此时slow保持不变,fast继续遍历。关键:nums[fast]!=nums[slow-2]方法一:classSolution{......
  • 454. 四数相加 II
    暴力不用多说,肯定是超时的,时间复杂度达到了O(n^4)classSolution{public:intfourSumCount(vector<int>&nums1,vector<int>&nums2,vector<int>&nums3,vector<int>&nums4){intnum=0;for(inti=0;i<nums1.siz......
  • Nginx采用虚拟目录的方式代理IIS站点
    Nginx采用虚拟目录的方式代理IIS站点起因背景由于IIS出现了某种不可知的问题,H5APP的部署从IIS改为Nginx。H5APP的Nginx的部署比较简单,直接修改官方的实例即可但是之前H5站点中有一个虚拟目录用于客户单点登录认证,所以需要在Nginx中添加对应的虚拟目录,但是单点认证是ASP.Net......