Hyper Strings InterviewStreet:Python

时间:2012-09-24 15:02:17

标签: python algorithm

https://www.interviewstreet.com/challenges/dashboard/#problem/4f802ebfad2a1
我的代码通过了6/10个测试用例。

from collections import Counter
j,k = map(int, raw_input().split())

y = Counter(len(raw_input()) for i in range(j))

saved = {}

def f(x):
    if x in saved:  return saved[x]
    if x<1: return 0
    k = y[x] if x in y else 0
    for i in y:
        k += y[i]*f(x-i)
   saved[x] = k
   return k
x = 0
for i in xrange(1,k+1):
    x+=f(i)

print (x+1)%1000000007

'y'中的键是超级字符串的长度,其值是超级字符串的数量,其长度设置为'H'。

'已保存'处理备忘录。

f(x)计算长度为x的超弦。我遍历了'for loop'中的所有值。

x的结果除了空字符串(''),因此x + 1

2 个答案:

答案 0 :(得分:2)

我认为当任何超级字符串是任何其他超级字符串的concat时,此代码会失败。 在这种情况下,此代码将多次添加一些案例。 例如:

3 2
a
b
ab

你的输出:8
正确输出:7
双重计算“ab”
我自己在尝试这个问题,如果得分为10/10则会发布答案

答案 1 :(得分:1)

好的,这是我的代码。我已经使用您的代码作为算法,但删除了可以通过串联其他超级字符串形成的超级字符串。 感谢您发布您的问题,我看到这篇文章之前的原始代码非常不理想。 任何进一步优化这一点的建议都是值得欢迎的。

from collections import Counter
j,k = map(int, raw_input().split())

supers_list = []

for i in range(j):
    supers_list.append(raw_input())

def check_concat(Str_, Sub_Str_):
    if Sub_Str_ == "":
        return False

    for i in supers_list:
        if i == Sub_Str_ and Str_ != Sub_Str_:
        return True
    x = Sub_Str_.startswith(i)
    if x == True:
        if check_concat(Str_, Sub_Str_[len(i):]) == True:
            return True
return False

def filter_():
    tmp = []
    global supers_list
    for i in supers_list:
        if check_concat(i,i) == False:
            tmp.append(i)
    supers_list = tmp

filter_()

y = Counter(len(i) for i in supers_list)

saved = {}

def f(x):
    if x in saved:  return saved[x]
    if x<1: return 0
    k = y[x] if x in y else 0
    for i in y:
        k += y[i]*f(x-i)
    saved[x] = k
    return k
x = 0
for i in xrange(1,k+1):
    x+=f(i)

print (x+1)%1000000007