鱼C论坛

 找回密码
 立即注册
查看: 5556|回复: 63

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

[复制链接]
发表于 2020-2-25 15:48:31 | 显示全部楼层 |阅读模式
30鱼币
今天的题目:


给定一个字符串,返回字符串的非空不同子串的个数。

示例 1:

输入:"abc"
输出:7
解释:7 个不同的子序列分别是 "a", "b", "c", "ab", "ac", "bc", 以及 "abc"。
示例 2:

输入:"aba"
输出:6
解释:6 个不同的子序列分别是 "a", "b", "ab", "ba", "aa" 以及 "aba"。
示例 3:

输入:"aaa"
输出:3
解释:3 个不同的子序列分别是 "a", "aa" 以及 "aaa"。


欢迎大家一起答题!
最佳答案
2020-2-25 15:48:32
本帖最后由 TJBEST 于 2020-2-26 15:34 编辑

先写一个可能会超时的,递归的,后面再想想别的方法优化
def fun337(string):#数学计算法
    def inner(index):
        if len(set(string[index:])) == M - index:
            return 2**(M - index - 1)
        else:
            result = 1
            for eachNum in dictionary:
                for inner_index in dictionary[eachNum]:
                    if inner_index > index:
                        if inner_index in resultDict:
                            result += resultDict[inner_index]
                        else:
                            temp = inner(inner_index)
                            result += temp
                            resultDict[inner_index]=temp
                        break
            return result
        
                                 
    dictionary = {}
    resultDict = {}
    M = len(string)
    for index in range(0,M):
        try:
            dictionary[string[index]].append(index)
        except Exception:
            dictionary[string[index]] = [index]
    result = 0
    if len(set(string)) == M:
        result += 2**M - 1
    else:
        for eachNum in dictionary:
            if dictionary[eachNum][0] in resultDict:
                result += resultDict[dictionary[eachNum][0]]
            else:
                temp = inner(dictionary[eachNum][0])
                result += temp
                resultDict[dictionary[eachNum][0]]=temp
    return result

最佳答案

查看完整内容

先写一个可能会超时的,递归的,后面再想想别的方法优化

评分

参与人数 2荣誉 +10 鱼币 +10 贡献 +6 收起 理由
ArmandXiao + 5 + 5 + 3
小甲鱼de粉丝 + 5 + 5 + 3 无条件支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2020-2-25 15:48:32 | 显示全部楼层    本楼为最佳答案   
本帖最后由 TJBEST 于 2020-2-26 15:34 编辑

先写一个可能会超时的,递归的,后面再想想别的方法优化
def fun337(string):#数学计算法
    def inner(index):
        if len(set(string[index:])) == M - index:
            return 2**(M - index - 1)
        else:
            result = 1
            for eachNum in dictionary:
                for inner_index in dictionary[eachNum]:
                    if inner_index > index:
                        if inner_index in resultDict:
                            result += resultDict[inner_index]
                        else:
                            temp = inner(inner_index)
                            result += temp
                            resultDict[inner_index]=temp
                        break
            return result
        
                                 
    dictionary = {}
    resultDict = {}
    M = len(string)
    for index in range(0,M):
        try:
            dictionary[string[index]].append(index)
        except Exception:
            dictionary[string[index]] = [index]
    result = 0
    if len(set(string)) == M:
        result += 2**M - 1
    else:
        for eachNum in dictionary:
            if dictionary[eachNum][0] in resultDict:
                result += resultDict[dictionary[eachNum][0]]
            else:
                temp = inner(dictionary[eachNum][0])
                result += temp
                resultDict[dictionary[eachNum][0]]=temp
    return result

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-2-25 16:32:30 | 显示全部楼层
给定的这个字符串能不能为空?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-25 16:35:41 | 显示全部楼层
fan1993423 发表于 2020-2-25 16:32
给定的这个字符串能不能为空?

保证字符串不为空。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-25 16:38:54 | 显示全部楼层
哦,我想问下,比如abac 是不是ab,aa,,ac,ba,bc,ac,aba,abc,bac都是,但cab这种倒过来的不是?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-25 16:41:03 | 显示全部楼层
fan1993423 发表于 2020-2-25 16:38
哦,我想问下,比如abac 是不是ab,aa,,ac,ba,bc,ac,aba,abc,bac都是,但cab这种倒过来的不是?

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

使用道具 举报

发表于 2020-2-25 16:42:29 | 显示全部楼层
def f337(x):
    s=set(' ')
    for a in x:
        s|={e+a for e in s}
    return len(s)-1
写个无脑版本,超时先不管了

评分

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

查看全部评分

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

使用道具 举报

 楼主| 发表于 2020-2-25 16:44:00 | 显示全部楼层
塔利班 发表于 2020-2-25 16:42
写个无脑版本,超时先不管了



输入 "pcrdhwdxmqdznbenhwjsenjhvulyve" 超出内存限制
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-25 16:56:42 | 显示全部楼层
嗯,排列组合题,先写个效率偏低的
from itertools import combinations
def fun337(s):
    result=0
    if len(s)==1:return 1
    elif len(s)==2:return 3 if len(set(s))==2 else 2
    for i in range(2,len(s)):result+=len(set(combinations(s,i)))
    result+=len(set(s))+1
    return result

评分

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

查看全部评分

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

使用道具 举报

 楼主| 发表于 2020-2-25 16:59:38 | 显示全部楼层
fan1993423 发表于 2020-2-25 16:56
嗯,排列组合题,先写个效率偏低的

输入 "pcrdhwdxmqdznbenhwjsenjhvulyve" 超出内存限制
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-25 17:09:57 | 显示全部楼层
来个比较蠢的方法
def f337(s):
    rs, l = [], len(s)
    for i in range(l):
        for j in range(i+1, l+1):
            if s[i:j] not in rs:       
                rs.append(s[i:j])
            if s[i::j] not in rs:       
                rs.append(s[i::j])
    return len(rs)

评分

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

查看全部评分

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

使用道具 举报

 楼主| 发表于 2020-2-25 17:10:40 | 显示全部楼层
kinkon 发表于 2020-2-25 17:09
来个比较蠢的方法

解答错误

输入:"bebb"
输出:8
预期结果:9
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-25 17:20:40 | 显示全部楼层
zltzlt 发表于 2020-2-25 17:10
解答错误

输入:"bebb"

能不能抽空列出9个包括哪些?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-25 17:23:04 | 显示全部楼层
kinkon 发表于 2020-2-25 17:20
能不能抽空列出9个包括哪些?

e, bbb, bebb, beb, bb, b, eb, ebb, be
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-25 17:52:45 | 显示全部楼层

abc和bac也是一样的吧?这应该是找组合,不是找排列。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-25 17:54:11 | 显示全部楼层
jeezy 发表于 2020-2-25 17:52
abc和bac也是一样的吧?这应该是找组合,不是找排列。

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

使用道具 举报

发表于 2020-2-25 18:19:19 | 显示全部楼层
zltzlt 发表于 2020-2-25 17:23
e, bbb, bebb, beb, bb, b, eb, ebb, be

看看还有没有问题
def f337(s):
    rs, l = [], len(s)
    for i in range(l):
        for j in range(i+1, l+1):
            if s[i:j] not in rs:       
                rs.append(s[i:j])
            if s[i::j] not in rs:       
                rs.append(s[i::j+i])
    return len(rs)
print(f337("bebb"))
print(f337("abc"))    
 

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-2-25 18:53:23 | 显示全部楼层
def f337(s):
    rs, l = [], len(s)
    for i in range(l):
        for j in range(i+1, l+1):
            if s[i:j] not in rs:      
                rs.append(s[i:j])
            if s[i::j] not in rs:      
                rs.append(s[i::j+i])
    return len(rs)
print(f337("bebb"))
print(f337("abc"))   
print(f337("aba"))
print(f337("aba"))
print(f337("aaa"))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-25 18:57:08 | 显示全部楼层
ef f337(s):
    rs, l = [], len(s)
    for i in range(l):
        for j in range(i+1, l+1):
            if s[i:j] not in rs:      
                rs.append(s[i:j])
            if s[i::j] not in rs:      
                rs.append(s[i::j+i])
    return len(rs)
print(f337("abc"))   
print(f337("aba"))
print(f337("aba"))
print(f337("aaa"))

评分

参与人数 2荣誉 -8 鱼币 -8 贡献 -3 收起 理由
fan1993423 -5 -5 -3
zltzlt -3 -3 禁止抄袭!

查看全部评分

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

使用道具 举报

发表于 2020-2-25 18:57:21 From FishC Mobile | 显示全部楼层
def fc337(string):
        s=set()
        for i in range(1,2**len(string)):
                l=str(bin(i))[2:]
                if len(l)<len(string):
                        l='0'*(len(string)-len(l))+l
                s.add(''.join([string[n] for n,e in enumerate(l) if e=='1']))
        print(len(s))
说白了就是找子集,幸好以前做过找子集,

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-26 09:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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