通过执行K个操作将S转换为T(HackerRank)

时间:2018-08-21 18:42:08

标签: string python-3.x algorithm logic

我正在解决HackerRank上的一个问题。它要求我查看是否可以通过执行modulus操作将字符串$x = 0; foreach($arr as $id){ //ch request - get data and add it into an array $x++; if($x % 10 == 0){ sleep(2); } } 转换为字符串curlhttps://www.hackerrank.com/challenges/append-and-delete/problem

我们可以执行的操作是:在s的末尾附加一个小写字母或从t的末尾删除一个小写字母。例如,k将返回s,因为我们需要3次操作,而不是2次。

我尝试如下解决问题:

s

但是,它在这个奇怪的测试用例中失败了。 Ash Ashley 2。预期的答案是No,但是根据我的代码,由于只需要执行一次操作,它将返回def appendAndDelete(s, t, k): if len(s) > len(t): maxs = [s,t] else: maxs = [t,s] maximum = maxs[0] minimum = maxs[1] k -= len(maximum) - len(minimum) substr = maximum[len(minimum): len(maximum)] maximum = maximum.replace(substr, '') i = 0 while i < len(maximum): if maximum[i] != minimum[i]: k -= (len(maximum)-i)*2 break i += 1 if k < 0: return 'No' else: return 'Yes' 。有什么我不懂的吗?

1 个答案:

答案 0 :(得分:0)

  

由于您不解释您的想法,因此我们很难理解   您在代码中的意思是什么,并对其进行调试以告诉您哪里出了问题。

但是,我想分享我的想法(我也在网站上解决了这个问题)-

len1 =>第一个字符串s的长度。

len2 =>第二个/目标字符串t的长度。

  • 恰好是K 有点棘手。因此,如果len1 + len2 <= k,您可以盲目地认为它可以完成并返回true,因为我们可以多次删除空字符串以得到一个空字符串(如前所述),并且可以删除一个字符串的字符并继续添加新字母以获得另一个字母。

  • 当我们从左到右开始将st进行匹配时,看起来更像longest common prefix,但这是不是的情况。让我们举个例子-

aaaaaaaaa (source)
aaaa (target)
7 (k)

在这里,直到aaaa都很常见,并且看起来源中还有其他5 a's。因此,我们可以删除这5个a并获得目标,但5!= 7,因此它似乎是No。但是情况并非如此,因为我们可以像这样从源中删除a,然后再次附加(2个操作)以满足k。因此,它不需要最长公共前缀始终存在,但是它使我们更接近解决方案。

  • 因此,让我们从左到右匹配两个字符串,并在不匹配时停止。假设我们在名为first_unmatched的变量中获得了此索引。在方法本身的开头初始化first_unmatched = min(len(s),len(t))

  

rem1 = len1-first_unmatched

     

rem2 = len2-first_unmatched

其中rem1s的剩余子字符串,而rem2t的剩余子字符串。

现在,条件来了。

  • if(rem1 + rem2 == k) return true- 这是因为要删除rem1个字符,并要添加rem2个字符。如果两者之和等于k,则有可能。

  • if(rem1 + rem2 > k) return false- 这是因为要删除rem1个字符,并要添加rem2个字符。如果两者之和大于k,则不可能。

  • if(rem1 + rem2 < k) return (k - (rem1 + rem2)) % 2 == 0- 这是因为要删除rem1个字符,并要添加rem2个字符。如果两者之和小于k,则取决于两者。

在这里,(k - (rem1 + rem2))将为您提供 k的额外收入。这笔额外费用可以或不能取决于是否可以被2整除。在这里,我们执行%2 是因为问题中有2个操作-deleteappend。如果多余的k 不足以进行任何运算,则答案为No,否则为Yes

您可以与上面的示例进行交叉检查。