鱼C论坛

 找回密码
 立即注册
查看: 8938|回复: 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"

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

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



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

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

    res = ''
    for i in range(len(s)+1):
        for j in range(i+2, len(s)+1):
            tmpStr = s[i:j]
            if tmpStr == tmpStr[::-1] and len(tmpStr)>len(res):
                res = tmpStr
                
    return res if res else s[0]

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

    res = ''
    for i in range(1, len(s)+1):
        j = 1
        while (i-j)>=0 and (i+j)<=len(s)+1:
            tmpStr = s[i-j:i+j+1]
            if tmpStr!=tmpStr[::-1]:
                tmpStr = s[i-j:i+j]
                
            if tmpStr!=tmpStr[::-1]:
                break
            if len(tmpStr)>len(res):                
                res = tmpStr                   

            j+=1           

    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 的最长公共子串
def longestPalindrome(s) -> str: # s 为字符串
    
    l = len(s)

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

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

    pos = 0 #位置
    mxlen = 0 #最长长度

    for i in range(1, l+1):
        for j in range(1, l+1):
            if s[i-1] == rev_s[j-1]:
                dp[i][j] = dp[i-1][j-1] + 1
                if dp[i][j] > mxlen:
                    mxlen = dp[i][j]
                    pos = i - 1
            else:
                dp[i][j] = 0

    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 编辑
def longestPalindrome(s): # s 为字符串
    isPalindrome = lambda x:x == x[::-1]
    allSubSet = lambda x:[x[j:j+i+1] for i in range(len(x)) for j in range(len(x)-i)]
    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 模板写了一个版本,大概是这样的
string longestPalindrome(string s) {
    int length[s.size()][s.size()];
    int result_position = 0;
    int result_length = 0;
    string s_rev(s.crbegin(), s.crend());
    for(int i = 0; i < s.size(); ++i) for(int j = 0; j < s_rev.size(); ++j){
        if(s[i] == s_rev[j]){
            if(i == 0 || j == 0) length[i][j] = 1;
            else length[i][j] = length[i - 1][j - 1] + 1;
            if(length[i][j] > result_length && s.size() + length[i][j] - j - 2 == i){   // 确保子串位置正确
                result_length = length[i][j];
                result_position = i;
            }
        }else{
            length[i][j] = 0;
        }
    }
    return s.substr(result_position - result_length + 1, result_length);
}
除了添加的一个额外判断之外和大佬的代码基本是完全等价的。

点评

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
不好意思,还是按照格式来吧。
不然这样没法测试(要放进一个类作为方法的)

def longestPalindrome(s): # s 为字符串
    isPalindrome = lambda x:x == x[::-1]
    allSubSet = lambda x:[x[j:j+i+1] for i in range(len(x)) for j in range(len(x)-i)]
    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 | 显示全部楼层
def longestPalindrome(s):
    # 获取s中所有子字符串组合
    lst = []
    for i in range(len(s)+1):
        for j in range(i+2, len(s)+1):
            lst.append(s[i:j])
            
    # 按字符串长度大小排序(长->短)
    lst = sorted(lst, key=len, reverse=True)

    # 回文
    for v in lst:
        if v == v[::-1]:
            return v

评分

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

查看全部评分

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

使用道具 举报

发表于 2022-8-10 12:17:13 | 显示全部楼层
class Solution:
    def longestPalindrome(self, s: str) -> str:
        def fun1(var):
            length=len(var)
            i=0
            last=length-1
            b=0
            while (i<length):
                
                if var[i]==var[last]:
                    
                    b+=1
                
                i+=1
                last-=1
            return b
        list1=[]
        for i in range(1,len(s)+1):
            for a in range(len(s)-i+1):
                list1+=[s[a:a+i]]
        list2=[]
        s=""
        for i in list1:
            if fun1(i)==len(i) and len(i)>len(s):
                s=i
        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 编辑
def longestPalindrome(s):
    if len(s)==1 or s==s[::-1]:
        return s

    res = ''
    maxLen = 0
    for i in range(len(s)+1):
        for j in range(i+2, len(s)+1):
            tmpStr = s[i:j]
            if tmpStr == tmpStr[::-1] and len(tmpStr)>len(res):
                res = tmpStr
    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 编辑
class Solution(object):
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        opp_s = s[::-1]
        s_len = len(s)
        for sub_len in range(1, s_len + 1):
            for sub_start in range(s_len - sub_len + 1):
                
                if opp_s[s_len - sub_start - sub_len:s_len - sub_start] == s[sub_start:sub_start + sub_len]:
                    slongest_start = sub_start
                    longestsub_len = sub_len
                    break
        s = s[slongest_start:slongest_start + longestsub_len]  

        return s

评分

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

查看全部评分

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

使用道具 举报

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


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

使用道具 举报

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

超出时间限制
输入
"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 编辑

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

    res = ''
    for i in range(len(s)+1):
        for j in range(i+2, len(s)+1):
            tmpStr = s[i:j]
            if tmpStr == tmpStr[::-1] and len(tmpStr)>len(res):
                res = tmpStr
                
    return res if res else s[0]

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

    res = ''
    for i in range(1, len(s)+1):
        j = 1
        while (i-j)>=0 and (i+j)<=len(s)+1:
            tmpStr = s[i-j:i+j+1]
            if tmpStr!=tmpStr[::-1]:
                tmpStr = s[i-j:i+j]
                
            if tmpStr!=tmpStr[::-1]:
                break
            if len(tmpStr)>len(res):                
                res = tmpStr                   

            j+=1           

    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-12-27 11:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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