鱼C论坛

 找回密码
 立即注册
查看: 8797|回复: 75

[已解决]Python:每日一题 292

[复制链接]
发表于 2019-12-20 19:56:00 | 显示全部楼层 |阅读模式
20鱼币
今天的题目:


给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。返回可以用这种方式转换成为的最短回文串

示例 1:

输入:"aacecaaa"
输出:"aaacecaaa"
示例 2:

输入:"abcd"
输出:"dcbabcd"


欢迎大家一起答题!
最佳答案
2019-12-20 19:56:01
本帖最后由 Croper 于 2019-12-20 23:58 编辑

变形的kmp搜索
  1. def fun292(s):
  2.     def nextarr(s):
  3.         l=len(s)//2
  4.         ret=[-1,0]
  5.         p=0
  6.         for q in range(1,l-1):
  7.             while (p!=-1 and s[p]!=s[q]):
  8.                 p=ret[p]
  9.             p+=1
  10.             ret.append(p);

  11.         for i in range(1,l):
  12.             if (s[i]==s[ret[i]]):
  13.                 ret[i]=ret[ret[i]]
  14.         return ret
  15.     next=nextarr(s)
  16.     p=0
  17.     q=-1
  18.     while (p-q<len(s)):
  19.         while (p!=-1 and s[p]!=s[q]):
  20.             p=next[p]
  21.         q-=1
  22.         p+=1
  23.     if (p+q+1==0):
  24.         return s
  25.     return  s[:p+q:-1]+ s
复制代码

最佳答案

查看完整内容

变形的kmp搜索

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-12-20 19:56:01 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Croper 于 2019-12-20 23:58 编辑

变形的kmp搜索
  1. def fun292(s):
  2.     def nextarr(s):
  3.         l=len(s)//2
  4.         ret=[-1,0]
  5.         p=0
  6.         for q in range(1,l-1):
  7.             while (p!=-1 and s[p]!=s[q]):
  8.                 p=ret[p]
  9.             p+=1
  10.             ret.append(p);

  11.         for i in range(1,l):
  12.             if (s[i]==s[ret[i]]):
  13.                 ret[i]=ret[ret[i]]
  14.         return ret
  15.     next=nextarr(s)
  16.     p=0
  17.     q=-1
  18.     while (p-q<len(s)):
  19.         while (p!=-1 and s[p]!=s[q]):
  20.             p=next[p]
  21.         q-=1
  22.         p+=1
  23.     if (p+q+1==0):
  24.         return s
  25.     return  s[:p+q:-1]+ s
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +3 收起 理由
zltzlt + 3 + 3 + 3 48 ms

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-12-20 20:36:33 From FishC Mobile | 显示全部楼层
先抢个沙发再说
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-12-20 20:37:15 | 显示全部楼层
_2_ 发表于 2019-12-20 20:36
先抢个沙发再说

先上传代码再说
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-12-20 20:45:50 | 显示全部楼层
  1. def solve(s):
  2.     def reverse_check(s):
  3.         for i in range(len(s)//2):
  4.             if s[i] != s[-1-i]:
  5.                 return False
  6.         return True
  7.     if reverse_check(s):
  8.         return s
  9.     else:
  10.         for i in range(1, len(s)):
  11.             if reverse_check(s[:-i]):
  12.                 return ''.join(reversed(s[-i:])) + s
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-12-20 20:52:43 | 显示全部楼层
  1. def fun(str1):
  2.     str2 = str1[::-1]
  3.     for i in range(len(str1)):
  4.         if str2[i:] == str1[0: len(str1)  - i]:
  5.             return str2[:i] + str1
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-12-20 21:05:11 | 显示全部楼层

输入 "a" * 40000 超时
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-12-20 21:06:44 | 显示全部楼层

解答错误

输入:""
输出;None
预期结果:""
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-12-20 21:12:01 | 显示全部楼层
zltzlt 发表于 2019-12-20 21:06
解答错误

输入:""

加上一行
  1. def fun(str1):
  2.     str2 = str1[::-1]
  3.     for i in range(len(str1)):
  4.         if str2[i:] == str1[0: len(str1)  - i]:
  5.             return str2[:i] + str1
  6.     return ''
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +3 收起 理由
zltzlt + 3 + 3 + 3 68 ms

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-12-20 21:17:59 | 显示全部楼层
  1. def solve(s):
  2.     temp=''
  3.     for each in s[::-1]:
  4.         m=temp+s
  5.         if m==m[::-1]:
  6.             return m
  7.         else:
  8.             temp+=each
  9.     return s
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +2 收起 理由
zltzlt + 3 + 3 + 2 704 ms

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-12-20 21:21:01 | 显示全部楼层
本帖最后由 阴阳神万物主 于 2019-12-20 23:05 编辑

改了一改,康康这回如何。
  1. def solve(s:str)->str:
  2.     '''
  3.     用最短方式在前方添加字符使其成为回文
  4.     '''
  5.     le = len(s)
  6.     rs = ''.join(reversed(s))
  7.     for d in range(le):
  8.         #print('调试',s[:le-d],rs[d:])
  9.         if s[:le-d] == rs[d:]:
  10.             break
  11.     return rs[:d] + s

  12. if __name__ == '__main__':
  13.     '''
  14.     print('示例1 输出:',solve("aacecaaa"))
  15.     print('示例2 输出:',solve('abcd'))
  16.     print('自测 输出:',solve('aca'))
  17.     '''
  18.     import random
  19.     def get(n:int):
  20.         alpha = 'abcdefghijklmnopqrstuvwxyz'
  21.         for i in range(n):
  22.             yield random.choice(alpha)
  23.     a = solve(''.join(get(40000)))
复制代码

这回感觉可以
  1. >>> c = ''.join(get(40000))
  2. >>> if True:
  3.         a = time.perf_counter()
  4.         solve(c)
  5.         b = time.perf_counter()

  6.         1001行的内容被折叠

  7. >>> b-a
  8. 0.6628862999999967
  9. >>>
复制代码



评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
zltzlt + 1 + 1 + 1 会超时

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-12-20 21:22:08 From FishC Mobile | 显示全部楼层
本帖最后由 Unicorn# 于 2019-12-20 21:23 编辑

..
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-12-20 21:23:21 | 显示全部楼层
  1. def solve(s):
  2.     count = 0
  3.     while True:
  4.         if s == s[::-1]:
  5.             return s
  6.         else:
  7.             s = s[:count] + s[-count-1] + s[count:]
  8.             count += 1
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +2 收起 理由
zltzlt + 3 + 3 + 2 756 ms

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-12-20 21:26:55 | 显示全部楼层
zltzlt 发表于 2019-12-20 21:05
输入 "a" * 40000 超时

这个不能怪我鸭
是在IDLE中显示结果超时,但是计算不会超时的
  1. ans = solve('a'*40000)
复制代码

这样如果不把结果显示出来,就一点毛病都没有的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-12-20 21:44:14 | 显示全部楼层
  1. def is_huiwenchuan(str):

  2.     list1 = list(str)
  3.     list2 =list1.copy()
  4.     list1.reverse()
  5.     if list1 == list2:
  6.         return True
  7.     else:
  8.         return False

  9. def huiwenchuan(str):

  10.     if is_huiwenchuan(str):
  11.         return str
  12.     #原始回文串长度
  13.     lenth = len(str)

  14.     k = 0
  15.     for i in range(1,lenth):
  16.         str1 = str[:-i]
  17.         if is_huiwenchuan(str1):
  18.             k = i
  19.             break

  20.     lst = list(str)
  21.     str2 = ''
  22.     for i in range(k):
  23.         str2 += lst[lenth-i-1]

  24.     str = str2 +str

  25.     return str
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-12-20 22:02:56 | 显示全部楼层
def solve(str1):
    str2 = str1[::-1]
    length = len(str1)

    for i in range(length):
        if str1[:length-i] == str2[i:]:
            return str2[:i] + str1

str1 = input('请输入文本:')
print(solve(str1))

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-12-20 22:11:38 | 显示全部楼层
Unicorn# 发表于 2019-12-20 21:26
这个不能怪我鸭
是在IDLE中显示结果超时,但是计算不会超时的

就是计算超时,我没有在 IDLE 中测试。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-12-20 22:12:40 | 显示全部楼层
本帖最后由 零0℃度 于 2019-12-20 22:21 编辑
  1. def f292(s):
  2.     i = 1
  3.     n = len(s)
  4.     while i < n:
  5.         if s[-i::-1] != s[:n+1-i]:
  6.             i+=1
  7.         else:
  8.             break
  9.     return s[-1:-i:-1] + s
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +2 收起 理由
zltzlt + 3 + 3 + 2 760 ms

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-12-20 22:16:49 | 显示全部楼层
本帖最后由 18463102026 于 2019-12-20 22:46 编辑
  1. def fun(lst):
  2.     if lst == lst[::-1]:
  3.         return lst
  4.     for i in range(1,len(lst)+1):
  5.         if lst[:-i] == lst[-1-i::-1]:
  6.             return lst[:-i-1:-1]+lst
  7.         i += 1
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +3 收起 理由
zltzlt + 3 + 3 + 3 440 ms

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-12-20 22:18:36 | 显示全部楼层
我写了一个程序 大概20分钟,可能有瑕疵
  1. def fun292(inputStr):
  2.     def isHuiwen(example):
  3.         lenth = len(example)
  4.         state = True
  5.         for i in range(0,lenth//2):
  6.             if example[i] != example[lenth-1-i]:
  7.                 state = False
  8.                 break
  9.         return state
  10.     if inputStr == '':
  11.         return ''
  12.     else:
  13.         strLenth = len(inputStr)
  14.         index_Hui = 0
  15.         for index in range(0,strLenth):
  16.             if isHuiwen(inputStr[0:strLenth-index]):
  17.                 index_Hui = strLenth-index -1
  18.                 break
  19.         first = inputStr[(strLenth-1):index_Hui:-1]
  20.         second = inputStr[0:index_Hui+1]
  21.         third = inputStr[(index_Hui+1):strLenth]
  22.      #   print(first)
  23.       #  print(second)
  24.         #print(third)
  25.         return first + second + third
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-4 01:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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