鱼C论坛

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

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

[复制链接]
发表于 2019-12-6 19:56:55 | 显示全部楼层 |阅读模式

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

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

x
今天的题目:


给定字符串 s,将它分割成若干回文子字符串。返回所有的分割方案。

说明:
1. 不同的方案之间的顺序可以是任意的。
2. 每种分割方案中的每个子字符串在 s 中必须是连续的。

示例 1:

输入:"a"
输出:[["a"]]
解释:字符串里只有一个字符,也就只有一种分割方式 (就是它本身)。
示例 2:

输入:"aab"
输出:[["aa", "b"], ["a", "a", "b"]]
解释:有两种分割的方式.
    1. 将 "aab" 分割成 "aa" 和 "b",它们都是回文的。
    2. 将 "aab" 分割成 "a", "a" 和 "b",它们都是回文的。


欢迎大家一起答题!
最佳答案
2019-12-8 00:40:01
  1. record = {}
  2. def solve(s):
  3.     if type(s) != list:
  4.         s = list(s)
  5.     if str(s) in record:
  6.         return record[str(s)]
  7.     elif len(s) == 0:
  8.         return [[]]
  9.     elif len(s) == 1:
  10.         record[str(s)] = [[s[0]]]
  11.         return [[s[0]]]
  12.     else:
  13.         res = []
  14.         temp = []
  15.         n = len(s)
  16.         for i in range(n):
  17.             temp.append(s[i])
  18.             if temp == list(reversed(temp)):
  19.                 for solution in solve(s[i+1:]):
  20.                     res.append([''.join(temp)]+solution)
  21.         record[str(s)] = res
  22.         return res
复制代码

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2019-12-6 19:58:49 | 显示全部楼层
本帖最后由 阴阳神万物主 于 2019-12-6 20:26 编辑

抢,沙发
代码:
  1. def solve(s:str)->list:
  2.     def ishw(ts:str)->bool:#判断所给字符串是否回文
  3.         b = list(ts)
  4.         c = b[:]
  5.         c.reverse()
  6.         return b == c
  7.     res = []
  8.     le = len(s)
  9.     for i in range(1,le+1):
  10.         now = s[:i]
  11.         if ishw(now):
  12.             get = solve(s[i:])
  13.             if get:
  14.                 for each in get:
  15.                     each.insert(0,now)
  16.                     res.append(each[:])
  17.             else:
  18.                 res.append([now])
  19.     return res
  20. if __name__ == '__main__':
  21.     print('示例1 输出:',solve('a'))
  22.     print('示例2 输出:',solve('aab'))
  23.     print('自测 输出:',solve('aabaa'))
复制代码
不晓得会不会过最大递归深度。
也不晓得会不会超时。

评分

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

查看全部评分

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

使用道具 举报

 楼主| 发表于 2019-12-6 19:59:02 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-6 20:01:16 | 显示全部楼层

话说,字符串里是只有字母吗还是怎么着?
我确认一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-6 20:01:58 | 显示全部楼层
阴阳神万物主 发表于 2019-12-6 20:01
话说,字符串里是只有字母吗还是怎么着?
我确认一下

不一定只有字母。

其实有没有字母对结果没影响。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2019-12-6 20:43:56 | 显示全部楼层
阴阳神万物主 发表于 2019-12-6 19:58
抢,沙发
代码:
不晓得会不会过最大递归深度。

恭喜通过!

执行用时:1208 ms
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-6 20:51:12 | 显示全部楼层
本帖最后由 danteer 于 2019-12-6 20:52 编辑
  1. def solve(s):
  2.     if len(s) == 1:
  3.         return [[s]]
  4.     list1 = [i for i in s]
  5.     result = [list1]
  6.     for i in range(1,len(list1)-1):
  7.         temp = 1
  8.         templist = []
  9.         while i - temp >= 0 and i + temp <= len(list1)-1:
  10.             if list1[i-temp] == list1[i+temp]:
  11.                 templist.append(temp)
  12.                 temp += 1
  13.             else:
  14.                 break
  15.         for each in templist:
  16.             listtemp = list1.copy()
  17.             strtemp = ''
  18.             for j in range(2*each+1):
  19.                 strtemp += listtemp.pop(i-each)
  20.             listtemp.insert(i-each,strtemp)
  21.             result.append(listtemp)
  22.     for i in range(0,len(list1)-1):
  23.         if list1[i] == list1[i+1]:
  24.             temp = 1
  25.             templist = [0]
  26.             while i - temp >= 0 and i + temp + 1 <= len(list1)-1:
  27.                 if list1[i-temp] == list1[i+temp+1]:
  28.                     templist.append(temp)
  29.                     temp += 1
  30.                 else:
  31.                     break
  32.             for each in templist:
  33.                 listtemp = list1.copy()
  34.                 strtemp = ''
  35.                 for j in range(2*each+2):
  36.                     strtemp += listtemp.pop(i-each)
  37.                 listtemp.insert(i-each,strtemp)
  38.                 result.append(listtemp)
  39.     return result
复制代码

没有递归,速度应该没问题

评分

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

查看全部评分

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

使用道具 举报

 楼主| 发表于 2019-12-6 20:58:20 | 显示全部楼层
danteer 发表于 2019-12-6 20:51
没有递归,速度应该没问题

解答错误

输入:"cbbbcc"
输出:[["cbbbc","c"],["c","bbb","c","c"],["c","b","b","b","cc"],["c","b","bb","c","c"],["c","bb","b","c","c"],["c","b","b","b","c","c"]]
预期结果:[["cbbbc","c"],["c","bbb","cc"],["c","b","bb","cc"],["c","bb","b","cc"],["c","bbb","c","c"],["c","b","b","b","cc"],["c","b","bb","c","c"],["c","bb","b","c","c"],["c","b","b","b","c","c"]]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-6 22:03:28 From FishC Mobile | 显示全部楼层
不好意思没看懂题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-6 22:04:37 | 显示全部楼层
hrp 发表于 2019-12-6 22:03
不好意思没看懂题

将一个字符串分割成若干个子字符串,每个子字符串都是回文字符串,求所有的分割方案。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-7 09:39:31 | 显示全部楼层
  1. def solve(s):
  2.     if len(s) == 1:
  3.         return [[s]]
  4.     list1 = [i for i in s]
  5.     result = [list1]
  6.     for i in range(1,len(list1)-1):
  7.         temp = 1
  8.         templist = []
  9.         while i - temp >= 0 and i + temp <= len(list1)-1:
  10.             if list1[i-temp] == list1[i+temp]:
  11.                 templist.append(temp)
  12.                 temp += 1
  13.             else:
  14.                 break
  15.         for each in templist:
  16.             listtemp = list1.copy()
  17.             strtemp = ''
  18.             for j in range(2*each+1):
  19.                 strtemp += listtemp.pop(i-each)
  20.             listtemp.insert(i-each,strtemp)
  21.             st = ''
  22.             for j in listtemp[i-each+1:]:
  23.                 st += j
  24.             lst = solve(st)
  25.             for j in range(len(lst)):
  26.                 lst[j] = listtemp[:i-each+1] + lst[j]
  27.             result.extend(lst)
  28.     for i in range(0,len(list1)-1):
  29.         if list1[i] == list1[i+1]:
  30.             temp = 1
  31.             templist = [0]
  32.             while i - temp >= 0 and i + temp + 1 <= len(list1)-1:
  33.                 if list1[i-temp] == list1[i+temp+1]:
  34.                     templist.append(temp)
  35.                     temp += 1
  36.                 else:
  37.                     break
  38.             for each in templist:
  39.                 listtemp = list1.copy()
  40.                 strtemp = ''
  41.                 for j in range(2*each+2):
  42.                     strtemp += listtemp.pop(i-each)
  43.                 listtemp.insert(i-each,strtemp)
  44.                 st = ''
  45.                 for j in listtemp[i-each+1:]:
  46.                     st += j
  47.                 lst = solve(st)
  48.                 for j in range(len(lst)):
  49.                     lst[j] = listtemp[:i-each+1] + lst[j]
  50.                 result.extend(lst)
  51.     return result
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2019-12-7 13:37:42 | 显示全部楼层
本帖最后由 闲愚 于 2019-12-7 13:50 编辑

这个应该没问题,就是有可能会超时
  1. def judge_str(s):
  2.     n = len(s)
  3.     result = 0
  4.     judge_list = []
  5.     if n == 1:
  6.         result = 1
  7.     else:
  8.         for i in range(n // 2):
  9.             if s[i] == s[n - i - 1]:
  10.                 judge_list.append(1)
  11.             else:
  12.                 judge_list.append(0)
  13.         if 0 not in judge_list:
  14.             result = 1
  15.     return result

  16. def split_str(s,k):
  17.     n = len(s)
  18.     result = []
  19.     if k > 1:
  20.         for i in range(n - k + 1):
  21.             if n > k:
  22.                 new_s = s[i + 1:]
  23.                 comb = split_str(new_s,k - 1)
  24.                 for item in comb:
  25.                     item.insert(0, s[:i + 1])
  26.                     result.append(item)
  27.             else:
  28.                 list1 = []
  29.                 for i in range(n):
  30.                     list1.append(s[i])
  31.                 result.append(list1)
  32.     else:
  33.         result.append([s])
  34.     return result

  35. str1 = 'cbbbcc'
  36. n = len(str1)
  37. for i in range(n):
  38.     list1 = split_str(str1,i + 1)
  39.     for member in list1:
  40.         list2 = []
  41.         for item in member:
  42.             list2.append(judge_str(item))
  43.         if 0 not in list2:
  44.             print(member)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2019-12-7 15:52:29 | 显示全部楼层
  1. import itertools
  2. def abc(st):
  3.     wzzh,result,length=[],[],len(st)
  4.     for i in range(length):
  5.         for j in itertools.combinations(range(1,length),i):
  6.             wzzh.append([0]+list(j)+[length])
  7.     for each in wzzh:
  8.         ls=[]
  9.         for i in range(len(each)-1):
  10.             m,n=each[i],each[i+1]
  11.             zhifu= st[m:n]
  12.             if zhifu==zhifu[::-1]:
  13.                 ls.append(st[m:n])
  14.             else:
  15.                 ls=[]
  16.                 break
  17.         if ls!=[]:
  18.             result.append(ls)
  19.     return  result
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2019-12-7 19:16:48 | 显示全部楼层
  1. def fun(s):
  2.     def chazhao(s):
  3.         '返回索引从0开始满足条件的回文序列的所有长度生成器'
  4.         n = 1
  5.         while n<=len(s):
  6.             s1 = s[:n]
  7.             if s1 == s1[::-1]:
  8.                 yield n
  9.             n += 1
  10.     for i in chazhao(s):
  11.         if i == len(s):
  12.             yield s.split(',')
  13.         else:
  14.             yield from [s[:i].split(',')+j for j in fun(s[i:])]



  15. s1 = 'cbbbcc'
  16. s1_out =[ i for i in fun(s1)]
  17. s2 = 'aabbbc'
  18. s2_out =[ i for i in fun(s2)]

  19. print(f"输入:{s1}\n输出:{s1_out}")
  20. print(f"输入:{s2}\n输出:{s2_out}")

  21. >>>
  22. ================== RESTART: C:\Users\13555\Desktop\每日一题.py ==================
  23. 输入:cbbbcc
  24. 输出:[['c', 'b', 'b', 'b', 'c', 'c'], ['c', 'b', 'b', 'b', 'cc'], ['c', 'b', 'bb', 'c', 'c'], ['c', 'b', 'bb', 'cc'], ['c', 'bb', 'b', 'c', 'c'], ['c', 'bb', 'b', 'cc'], ['c', 'bbb', 'c', 'c'], ['c', 'bbb', 'cc'], ['cbbbc', 'c']]
  25. 输入:aabbbc
  26. 输出:[['a', 'a', 'b', 'b', 'b', 'c'], ['a', 'a', 'b', 'bb', 'c'], ['a', 'a', 'bb', 'b', 'c'], ['a', 'a', 'bbb', 'c'], ['aa', 'b', 'b', 'b', 'c'], ['aa', 'b', 'bb', 'c'], ['aa', 'bb', 'b', 'c'], ['aa', 'bbb', 'c']]
  27. >>>
复制代码

评分

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

查看全部评分

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

使用道具 举报

 楼主| 发表于 2019-12-7 20:14:32 | 显示全部楼层
闲愚 发表于 2019-12-7 13:37
这个应该没问题,就是有可能会超时

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

使用道具 举报

 楼主| 发表于 2019-12-7 20:15:09 | 显示全部楼层

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

使用道具 举报

 楼主| 发表于 2019-12-7 20:16:08 | 显示全部楼层

恭喜通过!

执行用时:1185 ms
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-7 20:16:48 | 显示全部楼层

恭喜通过!

执行用时:1143 ms
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-8 00:40:01 | 显示全部楼层    本楼为最佳答案   
  1. record = {}
  2. def solve(s):
  3.     if type(s) != list:
  4.         s = list(s)
  5.     if str(s) in record:
  6.         return record[str(s)]
  7.     elif len(s) == 0:
  8.         return [[]]
  9.     elif len(s) == 1:
  10.         record[str(s)] = [[s[0]]]
  11.         return [[s[0]]]
  12.     else:
  13.         res = []
  14.         temp = []
  15.         n = len(s)
  16.         for i in range(n):
  17.             temp.append(s[i])
  18.             if temp == list(reversed(temp)):
  19.                 for solution in solve(s[i+1:]):
  20.                     res.append([''.join(temp)]+solution)
  21.         record[str(s)] = res
  22.         return res
复制代码

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 12:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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