要从一个字符串中删除的字母数,以便被另一个字符串整除

时间:2019-05-30 17:36:17

标签: algorithm greedy

我正在做这个问题https://www.spoj.com/problems/DIVSTR/

我们给了两个字符串S和T。 如果存在一些满足公式S = k * T

的非负整数k,则S可被字符串T整除。

应该从S删除的最小字符数是多少,以使S被T整除?

主要思想是使用指针将T与S进行匹配,并在计数完成后对S中出现的T的实例数进行计数,将指针移到T的开头,如果不匹配,则比较T的第一个字母加上S的礼物信。

此代码可以很好地处理他们提供的测试用例和我提供的自定义测试用例,但是无法通过隐藏的测试用例。

这是代码

def no_of_letters(string1,string2):
#     print(len(string1),len(string2))
    count = 0 
    pointer = 0
    if len(string1)<len(string2):
        return len(string1)
    if (len(string1)==len(string2)) and (string1!=string2):
        return len(string1)
    for j in range(len(string1)):
        if (string1[j]==string2[pointer]) and pointer<(len(string2)-1):
            pointer+=1
        elif (string1[j]==string2[pointer]) and pointer == (len(string2)-1):
            count+=1
            pointer=0
        elif (string1[j]!=string2[pointer]):
            if string1[j]==string2[0]:
                pointer=1
            else:
                pointer = 0
    return len(string1)-len(string2)*count

我认为应该混淆的一个地方是,相同的字母可以是两个字的一部分,但这应该不是问题,因为我们的答案不需要考虑重叠。

例如,S ='akaka'T ='aka'将给出输出2,而不考虑第一个'aka',ka作为计数或第二个ak'aka'。

1 个答案:

答案 0 :(得分:0)

我相信您可以轻松解决该问题。您只是想找出T的字符按顺序出现在S中的次数。 else 都是您删除的字符。例如,给定RobertBaron的S="akbaabka"T="aka"示例,您将编写例程以在其中定位字符akaS开始的那个顺序

akbaabka
ak a^
# with some pointer, ptr, now at position 4, marked with a caret above

完成后,您现在可以重复使用字符串的其余部分:

find_chars(S[ptr:], T)

每次通话时,您都在T中寻找S;如果找到它,则计算1次重复,然后重复S的其余部分;如果不是,则返回0(基本情况)。当您爬回递归堆栈时,累积所有1个计数,并且您的值为k

要删除的字符数为len(s) - k*len(T)

你能从那里拿走吗?