鱼C论坛

 找回密码
 立即注册
查看: 5304|回复: 33

[已解决]Python:【新】每日一题 4

[复制链接]
发表于 2022-8-10 02:33:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 liuzhengyuan 于 2022-8-10 03:55 编辑

专辑说明 每日废话:最近好忙啊

今天的题目:


给你一个字符串 s,找到 s 中最长的回文子串。
(今天为了回暖,会给超级奖励,暂不定期限)
请按照模板(来自力扣 - leetcode),模板见下

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案
示例 2:

输入:s = "cbbd"
输出:"bb"

欢迎大家来答题
模板:
  1. def longestPalindrome(s): # s 为字符串
  2.     <代码内容>
  3.     return s
复制代码


自己写的参考答案(不要抄袭,不要白嫖):
游客,如果您要查看本帖隐藏内容请回复



最佳答案
2022-8-11 11:34:41
本帖最后由 ba21 于 2022-8-11 11:58 编辑

搞个总结。
爆破:
  1. def longestPalindrome(s):
  2.     if len(s)==1 or s==s[::-1]:
  3.         return s

  4.     res = ''
  5.     for i in range(len(s)+1):
  6.         for j in range(i+2, len(s)+1):
  7.             tmpStr = s[i:j]
  8.             if tmpStr == tmpStr[::-1] and len(tmpStr)>len(res):
  9.                 res = tmpStr
  10.                
  11.     return res if res else s[0]
复制代码


高效:
  1. def longestPalindrome(s):
  2.     if len(s)==1 or s==s[::-1]:
  3.         return s

  4.     res = ''
  5.     for i in range(1, len(s)+1):
  6.         j = 1
  7.         while (i-j)>=0 and (i+j)<=len(s)+1:
  8.             tmpStr = s[i-j:i+j+1]
  9.             if tmpStr!=tmpStr[::-1]:
  10.                 tmpStr = s[i-j:i+j]
  11.                
  12.             if tmpStr!=tmpStr[::-1]:
  13.                 break
  14.             if len(tmpStr)>len(res):               
  15.                 res = tmpStr                  

  16.             j+=1           

  17.     return res
复制代码



2022811_115037.png


2022811_115759.png

评分

参与人数 2荣誉 +10 鱼币 +10 贡献 +5 收起 理由
青出于蓝 + 5 + 5 + 5 支持!
柿子饼同学 + 5 + 5

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-10 07:39:05 | 显示全部楼层
本帖最后由 柿子饼同学 于 2022-8-10 07:40 编辑

不知道这样行不行 , 就是求 s 和翻转后的 s 的最长公共子串
  1. def longestPalindrome(s) -> str: # s 为字符串
  2.    
  3.     l = len(s)

  4.     if l == 1: #长度为 1 直接返回
  5.         return s;
  6.    
  7.     rev_s = s[::-1] #翻转一下

  8.     dp = [[0 for _ in range(1000)] for _ in range(1000)]

  9.     pos = 0 #位置
  10.     mxlen = 0 #最长长度

  11.     for i in range(1, l+1):
  12.         for j in range(1, l+1):
  13.             if s[i-1] == rev_s[j-1]:
  14.                 dp[i][j] = dp[i-1][j-1] + 1
  15.                 if dp[i][j] > mxlen:
  16.                     mxlen = dp[i][j]
  17.                     pos = i - 1
  18.             else:
  19.                 dp[i][j] = 0

  20.     return s[pos - mxlen+1:pos+1]
复制代码

点评

允许去 leetcode 上自己测试,完成后发出来  发表于 2022-8-10 08:56

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +1 收起 理由
liuzhengyuan + 2 + 2 + 1 感谢回答,但有错(允许去 leetcode 上自己.

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-10 08:36:08 From FishC Mobile | 显示全部楼层
本帖最后由 qq1151985918 于 2022-8-10 11:55 编辑
  1. def longestPalindrome(s): # s 为字符串
  2.     isPalindrome = lambda x:x == x[::-1]
  3.     allSubSet = lambda x:[x[j:j+i+1] for i in range(len(x)) for j in range(len(x)-i)]
  4.     return sorted(filter(isPalindrome, allSubSet(s)), key=len)[-1]
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-10 08:48:41 | 显示全部楼层
柿子饼同学 发表于 2022-8-10 07:39
不知道这样行不行 , 就是求 s 和翻转后的 s 的最长公共子串

解答错误
输入:
"aacabdkacaa"
输出:
"aaca"
预期结果:
"aca"
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-10 08:53:59 | 显示全部楼层

不好意思,还是按照格式来吧。
不然这样没法测试(要放进一个类作为方法的)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-10 09:14:48 | 显示全部楼层
暴力解法和动态规划都可以嘛

点评

说错了,有能力的话可以试写一下代码,有奖励的  发表于 2022-8-10 09:17
最好不要发无意义帖子啦  发表于 2022-8-10 09:15
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-10 10:32:20 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-10 11:30:06 | 显示全部楼层
本帖最后由 dolly_yos2 于 2022-8-10 11:31 编辑
柿子饼同学 发表于 2022-8-10 07:39
不知道这样行不行 , 就是求 s 和翻转后的 s 的最长公共子串


这个方法还是挺让人(让我)眼前一亮的,非常巧妙,只是稍微少了一点细节。
最长公共子串的条件不够充分,还要保证这一组子串来自相同的位置才是原字符串的最长回文子串。在现有基础上稍加修改(给答案更新添加一个额外的判断条件)就可以了。
用 C++ 按照 leetcode 模板写了一个版本,大概是这样的
  1. string longestPalindrome(string s) {
  2.     int length[s.size()][s.size()];
  3.     int result_position = 0;
  4.     int result_length = 0;
  5.     string s_rev(s.crbegin(), s.crend());
  6.     for(int i = 0; i < s.size(); ++i) for(int j = 0; j < s_rev.size(); ++j){
  7.         if(s[i] == s_rev[j]){
  8.             if(i == 0 || j == 0) length[i][j] = 1;
  9.             else length[i][j] = length[i - 1][j - 1] + 1;
  10.             if(length[i][j] > result_length && s.size() + length[i][j] - j - 2 == i){   // 确保子串位置正确
  11.                 result_length = length[i][j];
  12.                 result_position = i;
  13.             }
  14.         }else{
  15.             length[i][j] = 0;
  16.         }
  17.     }
  18.     return s.substr(result_position - result_length + 1, result_length);
  19. }
复制代码

除了添加的一个额外判断之外和大佬的代码基本是完全等价的。

点评

c++ 也可以的,强的!  发表于 2022-8-10 21:35

评分

参与人数 1荣誉 +4 鱼币 +4 贡献 +2 收起 理由
liuzhengyuan + 4 + 4 + 2 236ms 11.2mb

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-10 11:40:37 | 显示全部楼层
本帖最后由 qq1151985918 于 2022-8-10 11:55 编辑
liuzhengyuan 发表于 2022-8-10 08:53
不好意思,还是按照格式来吧。
不然这样没法测试(要放进一个类作为方法的)

  1. def longestPalindrome(s): # s 为字符串
  2.     isPalindrome = lambda x:x == x[::-1]
  3.     allSubSet = lambda x:[x[j:j+i+1] for i in range(len(x)) for j in range(len(x)-i)]
  4.     return sorted(filter(isPalindrome, allSubSet(s)), key=len)[-1]
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +1 收起 理由
liuzhengyuan + 2 + 2 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-10 12:16:42 | 显示全部楼层
  1. def longestPalindrome(s):
  2.     # 获取s中所有子字符串组合
  3.     lst = []
  4.     for i in range(len(s)+1):
  5.         for j in range(i+2, len(s)+1):
  6.             lst.append(s[i:j])
  7.             
  8.     # 按字符串长度大小排序(长->短)
  9.     lst = sorted(lst, key=len, reverse=True)

  10.     # 回文
  11.     for v in lst:
  12.         if v == v[::-1]:
  13.             return v
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
liuzhengyuan + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-10 12:17:13 | 显示全部楼层
  1. class Solution:
  2.     def longestPalindrome(self, s: str) -> str:
  3.         def fun1(var):
  4.             length=len(var)
  5.             i=0
  6.             last=length-1
  7.             b=0
  8.             while (i<length):
  9.                
  10.                 if var[i]==var[last]:
  11.                     
  12.                     b+=1
  13.                
  14.                 i+=1
  15.                 last-=1
  16.             return b
  17.         list1=[]
  18.         for i in range(1,len(s)+1):
  19.             for a in range(len(s)-i+1):
  20.                 list1+=[s[a:a+i]]
  21.         list2=[]
  22.         s=""
  23.         for i in list1:
  24.             if fun1(i)==len(i) and len(i)>len(s):
  25.                 s=i
  26.         return s  
复制代码

比较暴力...

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +1 收起 理由
liuzhengyuan + 2 + 2 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-10 13:01:56 | 显示全部楼层
dolly_yos2 发表于 2022-8-10 11:30
这个方法还是挺让人(让我)眼前一亮的,非常巧妙,只是稍微少了一点细节。
最长公共子串的条件不够充 ...

不敢不敢 , 我之前没想到有这个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-10 13:36:22 | 显示全部楼层
本帖最后由 ba21 于 2022-8-10 19:09 编辑

  1. def longestPalindrome(s):
  2.     if len(s)==1 or s==s[::-1]:
  3.         return s

  4.     res = ''
  5.     maxLen = 0
  6.     for i in range(len(s)+1):
  7.         for j in range(i+2, len(s)+1):
  8.             tmpStr = s[i:j]
  9.             if tmpStr == tmpStr[::-1] and len(tmpStr)>len(res):
  10.                 res = tmpStr
  11.     return res
复制代码

评分

参与人数 1贡献 +2 收起 理由
liuzhengyuan + 2 到上限了

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-10 14:59:14 | 显示全部楼层
本帖最后由 乙方al 于 2022-8-10 15:06 编辑

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-10 20:16:35 | 显示全部楼层
本帖最后由 一点点儿 于 2022-8-10 20:54 编辑
  1. class Solution(object):
  2.     def longestPalindrome(self, s):
  3.         """
  4.         :type s: str
  5.         :rtype: str
  6.         """
  7.         opp_s = s[::-1]
  8.         s_len = len(s)
  9.         for sub_len in range(1, s_len + 1):
  10.             for sub_start in range(s_len - sub_len + 1):
  11.                
  12.                 if opp_s[s_len - sub_start - sub_len:s_len - sub_start] == s[sub_start:sub_start + sub_len]:
  13.                     slongest_start = sub_start
  14.                     longestsub_len = sub_len
  15.                     break
  16.         s = s[slongest_start:slongest_start + longestsub_len]  

  17.         return s
复制代码

评分

参与人数 1荣誉 +4 鱼币 +4 贡献 +2 收起 理由
liuzhengyuan + 4 + 4 + 2 4496ms 15.1mb

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-10 21:37:15 | 显示全部楼层


超出时间限制
输入
  1. "uhrfjotnewtodhmbplsaolnpcdaohiytmfllukijouxipvqohtsgxbtfoxyfkfczkfwhzimbefiohmtimrcxbpgcxogystdkcqujvbxsgirpccdnvejtljftwkdpsqpflzwruwwdzovsbmwbcvlftkjnxqaguvtsycylqzquqkbnybnbaeahbxejhphwrpmymcemuhljwtuvxefqfzjhskuqhifydkxpnfwfxkpeexnjltfqwfvchphmtsrsyayxukvmlqodshqwbeaxhcxdbssnrdzvxtusngwqdxvluauphmmbwmgtazjwvolenegwbmjfwprfuswamyvgrgshqocnhirgyakbkkggviorawadzhjipjjgiwpelwxvtaegauerbwpalofrbghfhnublttqtcmqskcocwwwxpnckrnbepusjyohsrretrqyvgnbezuvwmzizcefxyumtdwnqjkgsktyuacfpnqocqjxcurmipjfqmjqrkdeqsfseyigqlwmzgqhivbqalcxhlzgtsfjbdbfqiedogrqasgmimifdexbjjpfusxsypxobxjtcwxnkpgkdpgskgkvezkriixpxkkattyplnpdbdifforxozfngmlgcunbnubzamgkkfbswuqfqrvzjqmlfqxeqpjaqayodtetsecmfbplscmslpqiyhhykftzkkhshxqvdwmwowokpluwyvavwvofwqtdilwqjgrprukzyhckuspyzaoe"
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-10 21:40:30 | 显示全部楼层

超出时间限制
输入
  1. "civilwartestingwhetherthatnaptionoranynartionsoconceivedandsodedicatedcanlongendureWeareqmetonagreatbattlefiemldoftzhatwarWehavecometodedicpateaportionofthatfieldasafinalrestingplaceforthosewhoheregavetheirlivesthatthatnationmightliveItisaltogetherfangandproperthatweshoulddothisButinalargersensewecannotdedicatewecannotconsecratewecannothallowthisgroundThebravelmenlivinganddeadwhostruggledherehaveconsecrateditfaraboveourpoorponwertoaddordetractTgheworldadswfilllittlenotlenorlongrememberwhatwesayherebutitcanneverforgetwhattheydidhereItisforusthelivingrathertobededicatedheretotheulnfinishedworkwhichtheywhofoughtherehavethusfarsonoblyadvancedItisratherforustobeherededicatedtothegreattdafskremainingbeforeusthatfromthesehonoreddeadwetakeincreaseddevotiontothatcauseforwhichtheygavethelastpfullmeasureofdevotionthatweherehighlyresolvethatthesedeadshallnothavediedinvainthatthisnationunsderGodshallhaveanewbirthoffreedomandthatgovernmentofthepeoplebythepeopleforthepeopleshallnotperishfromtheearth"
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-10 21:45:15 | 显示全部楼层

第一个代码:
解答错误:
输入:
"a"
输出:
null
预期结果:
"a"

第二个代码:
输入:
"ac"
输出:
""
预期结果:
"a"
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-10 22:00:42 | 显示全部楼层
看看

点评

了解思路的话,就自己试着写一遍把~  发表于 2022-8-10 22:05
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-11 11:34:41 | 显示全部楼层    本楼为最佳答案   
本帖最后由 ba21 于 2022-8-11 11:58 编辑

搞个总结。
爆破:
  1. def longestPalindrome(s):
  2.     if len(s)==1 or s==s[::-1]:
  3.         return s

  4.     res = ''
  5.     for i in range(len(s)+1):
  6.         for j in range(i+2, len(s)+1):
  7.             tmpStr = s[i:j]
  8.             if tmpStr == tmpStr[::-1] and len(tmpStr)>len(res):
  9.                 res = tmpStr
  10.                
  11.     return res if res else s[0]
复制代码


高效:
  1. def longestPalindrome(s):
  2.     if len(s)==1 or s==s[::-1]:
  3.         return s

  4.     res = ''
  5.     for i in range(1, len(s)+1):
  6.         j = 1
  7.         while (i-j)>=0 and (i+j)<=len(s)+1:
  8.             tmpStr = s[i-j:i+j+1]
  9.             if tmpStr!=tmpStr[::-1]:
  10.                 tmpStr = s[i-j:i+j]
  11.                
  12.             if tmpStr!=tmpStr[::-1]:
  13.                 break
  14.             if len(tmpStr)>len(res):               
  15.                 res = tmpStr                  

  16.             j+=1           

  17.     return res
复制代码



2022811_115037.png


2022811_115759.png

点评

216ms 15.1mb  发表于 2022-8-11 21:36

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +1 收起 理由
liuzhengyuan + 2 + 2 + 1 强!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 17:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表