鱼C论坛

 找回密码
 立即注册
查看: 3906|回复: 53

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

[复制链接]
发表于 2020-3-22 21:17:08 | 显示全部楼层 |阅读模式

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

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

x
今天的题目:


给定一组没有重复元素的单词 word,找出所有不同的索引对 (c, d),使得 words[c] + words[d] 可拼接成一个回文串。

示例 1:

输入:["abcd", "dcba", "lls", "s", "sssll"]
输出:[[0, 1], [1, 0], [3, 2], [2,4]]
解释:可拼接成的回文串为 ["dcbaabcd", "abcddcba", "slls", "llssssll"]
示例 2:

输入:["bat", "tab", "cat"]
输出:[[0, 1], [1, 0]]
解释:可拼接成的回文串为 ["battab", "tabbat"]


欢迎大家一起答题!
最佳答案
2020-3-22 22:05:58
def fun357(word):
    result = []
    dict1 = {a: i for i, a in enumerate(word)}
    for i, a in enumerate(word):
        ma = len(a)
        for j in range(ma + 1):
            sa, st = a[:j], a[j:]
            ssa, sst = sa[::-1], st[::-1]
            if sa == ssa and sst in dict1:
                m = dict1[sst]
                if m != i: result.append([m, i])
            if j != ma and st == sst and ssa in dict1:
                result.append([i, dict1[ssa]])
    return result

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2020-3-22 21:31:19 | 显示全部楼层
本帖最后由 TJBEST 于 2020-3-23 18:02 编辑

不知道这个二元序列的顺序是否任意?我的第一个实例测试,序对正确,但是顺序不太一样
def fun357(words):
    M = len(words)
    len_arr = [len(i) for i in words]
    result = []#考虑c==d的情况
    for index in range(0,M):
        P = len_arr[index]
        P_str = words[index]
        for inner in range(0,M):
            Q = len_arr[inner]
            Q_str = words[inner]
            state = True
            if P > Q:
                N = (P - Q)//2
                for other in range(0,Q):
                    if P_str[other] != Q_str[-(other+1)]:
                        state = False
                        break
                if state == False:
                    continue
                for other in range(0,N):
                    if P_str[Q+other] != P_str[-(other+1)]:
                        state = False
                        break
                if state == True:
                    result.append([index,inner])
            elif P < Q:
                N = (Q - P)//2
                for other in range(0,P):
                    if P_str[other] != Q_str[-(other+1)]:
                        state = False
                        break
                if state == False:
                    continue
                for other in range(0,N):
                    if Q_str[other] != Q_str[Q-P-(other+1)]:
                        state = False
                        break
                if state == True:
                    result.append([index,inner])
            else:
                for other in range(0,P):
                    if P_str[other] != Q_str[-(other+1)]:
                        state = False
                        break
                if state == True:
                    result.append([index,inner])
    return [each for each in result if each[0]!=each[1]]#剔除自洽

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-22 21:32:36 | 显示全部楼层
def test(word):
    result = []
    for i in range(len(word)):
        for j in range(len(word)):
            if i == j:
                continue
            joint = word[i] + word[j]
            if joint == joint[::-1]:
                result.append([i, j])
    return result

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-22 21:38:13 | 显示全部楼层
def fun357(list1):
    result=[]
    for i in range(len(list1)):
        for j in range(i+1,len(list1)):
            if i!=j:
                temp=list1[i]+list1[j]
                if temp==temp[::-1]:
                    result.append([i,j])
                temp=list1[j]+list1[i]
                if temp==temp[::-1]:
                    result.append([j,i])
    return result

print(fun357(["abcd", "dcba", "lls", "s", "sssll"]))
print(fun357(["bat", "tab", "cat"]))

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-22 21:48:58 | 显示全部楼层
先占楼,昨天的没看到都解决了,没法回答了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-22 21:56:14 | 显示全部楼层
一个愚蠢的方法
def f357(list1):
    lst=[]
    for i in range(len(list1)):
        for j in range(len(list1)):
            tmp=list(list1[i] + list1[j])
            tmp.reverse()
            if list(list1[i]+list1[j])==tmp:
                if i!=j:
                    lst.append([i,j])
    return lst

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-22 22:05:58 | 显示全部楼层    本楼为最佳答案   
def fun357(word):
    result = []
    dict1 = {a: i for i, a in enumerate(word)}
    for i, a in enumerate(word):
        ma = len(a)
        for j in range(ma + 1):
            sa, st = a[:j], a[j:]
            ssa, sst = sa[::-1], st[::-1]
            if sa == ssa and sst in dict1:
                m = dict1[sst]
                if m != i: result.append([m, i])
            if j != ma and st == sst and ssa in dict1:
                result.append([i, dict1[ssa]])
    return result

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-22 22:06:51 | 显示全部楼层
本帖最后由 kinkon 于 2020-3-23 11:37 编辑

先跑起来,速度有点慢,后面再想其他办法
def f357(arr):
    s, res = len(arr), []
    tmp = tmp1 = ''
    for i in range(s-1):
        for j in range(i+1, s):
            tmp = arr[i] + arr[j]
            tmp1 = arr[j] + arr[i]  
            if tmp == tmp[::-1]:
                res += [[i,j]]
            if tmp1 == tmp1[::-1]:
                res += [[j,i]]
                    
    return res 

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-22 22:22:36 | 显示全部楼层
def function(list1):
    def f(s):
        if len(s)%2 == 0:
            s1 = s[:int(len(s)/2)] + s[:int(len(s)/2)][::-1]
        else:
            s1 = s[:int(len(s)/2)+1] + s[:int(len(s)/2)][::-1]
        if s1 == s:
            return True
        else:
            return False
    list2 = []
    for i in range(len(list1)):
        for j in range(len(list1)):
            if i != j:
                if f(list1[i]+list1[j]):
                    list2.append([i,j])
    return list2

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-22 22:30:50 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-3-23 10:17 编辑

没想到啥好方法
from itertools import permutations as perm

def function(word):
    result=[]

    for i,j in perm(range(len(word)),2):
        k=word[i]+word[j]

        if k==k[::-1]:
            result.append([i,j])

    return result

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-22 22:44:58 | 显示全部楼层
本帖最后由 flamezyy 于 2020-3-22 23:25 编辑
def f357(arr):
    result = []
    for each in map(lambda i : (i[0]+i[1],i[0],i[1]), [(x , y) for x in arr for y in arr]):
        if each[1] != each[2]:
            if each[0] == each[0][::-1]:
                result.append([arr.index(each[1]),arr.index(each[2])])
            else:
                continue
        else:
            continue
    else:
        return result
做题可太有意思了

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-23 00:43:30 | 显示全部楼层
def fun357(lst):
    if not len(lst):return 0
    result=[]
    for i in range(len(lst)):
        for j in range(len(lst)):
            if i!=j and lst[j][::-1].startswith(lst[i]):
                result.append([i,j])
    return result

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-23 04:25:08 | 显示全部楼层
本帖最后由 ouyunfu 于 2020-3-23 04:35 编辑
from itertools import permutations as p
def f357(words:list)->list:
    L=[]
    for i in p(range(len(words)),2):
        a=words[i[0]]+words[i[1]]
        if a[::-1]==a:
            L.append(list(i))
    return L
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-23 04:40:39 | 显示全部楼层
本帖最后由 ouyunfu 于 2020-3-23 04:42 编辑

尝试一行代码
from itertools import permutations as p
def f357(w):
    return [list(i) for i in p(range(len(w)),2) if (w[i[0]]+w[i[1]])[::-1]==w[i[0]]+w[i[1]]]

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-23 07:27:45 | 显示全部楼层
先插个眼看大佬打架
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-23 12:16:06 | 显示全部楼层
from itertools import permutations

def fun357(words):
    result = []
    for i in permutations([j for j in range(len(words))],2):
        combination = words[i[0]] + words[i[1]]
        if combination == combination[::-1]:
            result.append([i[0],i[1]])
    return result

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-23 12:48:18 | 显示全部楼层
一行式
def fun357(lst):
    if not len(lst):return 0
    return [[i,j] for i in range(len(lst)) for j in range(len(lst)) if i!=j and lst[j][::-1].startswith(lst[i])]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-23 13:08:08 | 显示全部楼层
def huiwen(list1):
    list2 = []
    for i in range(len(list1)):
        for j in range(len(list1)):
            if j == i:
                continue
            else:
                str1 = list1[i] + list1[j]
                if str1 == str1[::-1]:
                    list2.append((i,j))
    return list2
list1 = ["abcd", "dcba", "lls", "s", "sssll"]
print(huiwen(list1))

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-23 13:08:25 | 显示全部楼层

def is_palindromic(str1, str2):
    determine = str1 + str2
    if determine == determine[::-1]:
        return True
    else:
        return False


def joint_palindromic(words):
    words_num = len(words)
    result = []
    for i in range(words_num):
        for j in range(i+1, words_num):
            if is_palindromic(words[i], words[j]):
                result.append([i, j])
            if is_palindromic(words[j], words[i]):
                result.append([j, i])
    return result

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-23 13:10:27 | 显示全部楼层
def hw(x):
    a = list(x)
    if a == list(reversed(a)):
        return 1
    else:
        return 0
def f357(x):
    b = []
    for i in range(len(x)):
        for j in range(len(x)):
            if i != j:
                c = x[i] + x[j]
                if hw(c) == 1:
                    b.append([i, j])
    return b
先发一个暴力法,再看看能不能优化

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 19:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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