鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: ooxx7788

[技术交流] Python:每日一题 42

[复制链接]
发表于 2019-1-8 14:07:28 | 显示全部楼层
  1. def decide(str2):
  2.     #判断是否为回联文,返回True or Fasle
  3.     #长度至少为2
  4.     if len(str2) < 2:
  5.         return False
  6.     else:
  7.         if str2 == str2[::-1]:
  8.             return True
  9.         else:
  10.             return False
  11.         

  12. def fun42(str1):
  13.     #用于判断给出的字符串内是否含有回联文子字符串
  14.     palindrome = False
  15.     length = len(str1)
  16.     num = length
  17.     dict1 = {}
  18.     list1 = []

  19.     for each in range(length):
  20.         if decide(str1[:num]):
  21.             palindrome = True
  22.             dict1[num] = str1[:num]
  23.             list1.append(num)
  24.         if decide(str1[num:length]):
  25.             palindrome = True
  26.             dict1[-num] = str1[num:length]
  27.             list1.append(-num)
  28.         num -= 1

  29.     #然后是判断优先度,根据题目要求取优先度最小的数字,即右侧取反
  30.     if palindrome:
  31.         #右侧取反
  32.         if min(list1) < 0:
  33.             str3 = str1[:] + str1[:abs(min(list1))][::-1]
  34.         #左侧取反
  35.         else:
  36.             str3 = str1[max(list1):][::-1] + str1[:]
  37.     else:
  38.         str3 = str1[:-1] + str1[::-1]
  39.     print(str3)



  40. fun42('ssyssas')
  41. fun42('leveled')
  42. fun42('race')
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-29 23:53:01 | 显示全部楼层
写得有点长。。。看看答案
  1. def answer(strs):
  2.     # 首先判断str结尾是不是重复字符
  3.     if strs[-1] == strs[-2]:
  4.         temp = strs
  5.         while True:
  6.             if temp[-1] == temp[-2]:
  7.                 # 切片剔除末尾
  8.                 temp = temp[:-1]
  9.             else:
  10.                 break
  11.         temp = temp[:-1][::-1]
  12.         forward = strs + temp
  13.     #求结尾非重复正向回文
  14.     else:
  15.         temp = strs
  16.         i = -2
  17.         while not temp == temp[::-1]:
  18.             temp += strs[i]
  19.             i -= 1
  20.         forward = temp
  21.     #求逆向回文:从后切片判断,如果包含回文子字符串,在头部加上切掉的子字符串倒序
  22.     temp2 = strs
  23.     while True:
  24.         if temp2 != temp2[::-1]:
  25.             temp2 = temp2[:-1]
  26.         else:
  27.             break
  28.     backward = strs[:].split(temp2)[-1][::-1] + strs
  29.     # 比较正序、逆序回文长度后返回
  30.     if len(backward) < len(forward):
  31.         return backward
  32.     else:
  33.         return forward


  34. answer('leveled')
  35. test.assert_equals(answer('ab'), 'aba');
  36. test.assert_equals(answer('abb'), 'abba');
  37. test.assert_equals(answer('abc'), 'abcba');
  38. test.assert_equals(answer('rad'), 'radar');
  39. test.assert_equals(answer('race'), 'racecar')
  40. test.assert_equals(answer('leveled'), 'deleveled')
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-30 09:10:36 | 显示全部楼层
本帖最后由 panheng 于 2019-8-30 09:16 编辑

受到版主的启发,重新梳理了逻辑后重写了代码
  1. def answer(strs):
  2.     temp1 = temp2 = strs[:]                    #拷贝两个字符串
  3.     while True:
  4.         if strs == strs[::-1]:                 #本身整体即是回文返回自身
  5.             return strs
  6.         # 正向求回文
  7.         if temp1 != temp1[::-1]:
  8.             temp1 = temp1[1:]              #头部切片
  9.         else:
  10.             result = strs + strs.split(temp1,1)[0][::-1]          #尾段出现回文,求出正向回文
  11.             break
  12.         #逆向求回文
  13.         if temp2 != temp2[::-1]:
  14.             temp2 = temp2[:-1]                                      #尾部切片
  15.         else:
  16.             result = strs.split(temp2,1)[1][::-1] + strs          #头部出现回文,求出逆向回文
  17.             break
  18.     #先出现子回文者跳出循环,同等条件时在正向跳出
  19.     return result
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-27 10:25:22 | 显示全部楼层
  1. def f_42(string:str) -> str:
  2.     palindrome = ''
  3.     # 找出原字符串的子字符串是否含有回文,用两个循环遍历
  4.     for i in range(len(string)):
  5.         for j in range(i+2, len(string)):
  6.             if string[i:j] == string[i:j][::-1]:
  7.                 # 若子字符串又多个回文找出最长的一个
  8.                 if len(string[i:j]) >= len(palindrome):
  9.                     palindrome = string[i:j]
  10.                     # 记录下标
  11.                     a = i  
  12.                     b = j
  13.    
  14.     # 如果原字符串没有回文,构造一个
  15.     if len(palindrome) == 0:
  16.         return string + string[::-1][1:]
  17.     # 若有,则取最长的回文与首尾剩余的字符串拼接构造出新的回文
  18.     else:
  19.         return string[::-1][:len(string)-b] + string[:a] + palindrome + string[:a] + string[b:]

  20. print(f_42('aleveled'))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-31 00:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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