【问题标题】:Convert S to T by performing K operations (HackerRank)通过执行 K 操作将 S 转换为 T (HackerRank)
【发布时间】:2018-08-21 18:42:08
【问题描述】:

我正在解决 HackerRank 上的一个问题。它要求我查看是否可以通过执行k 操作将字符串s 转换为字符串thttps://www.hackerrank.com/challenges/append-and-delete/problem

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

我尝试如下解决问题:

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'

但是,它在这个奇怪的测试用例中失败了。 y yu 2。预期的答案是No,但根据我的代码,它会返回Yes,因为只需要一个操作。有什么不明白的地方吗?

【问题讨论】:

  • 你必须使用恰好 k 个操作。
  • 继续执行编辑操作,直到您点击“k”。如果 i, j ( s, t 的索引) 处的字符不相等,将有两条路径:追加、删除 - 遍历每个路径,但跟踪您遍历的路径的长度。如果它等于 k ​​就不要再进一步了。如果在 k 之前的任何时候你可以获得相等的字符串,则返回 true。
  • 实际上我收回“如果在 k 之前的任何时候你可以得到相等的字符串,返回 true。”检查树的第 k 层,如果字符串相等则返回 true,否则返回 false。
  • 解释你的代码。

标签: string python-3.x algorithm logic


【解决方案1】:

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

不过,我想分享一下我的想法(我也在网站上解决了这个问题)-

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

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

  • 正是 K 让它有点棘手。所以,如果len1 + len2 &lt;= 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 &gt; k) return false- 这是因为要删除 rem1 字符和要添加 rem2 字符。如果两者的总和都大于k,那么这是不可能的。

  • if(rem1 + rem2 &lt; k) return (k - (rem1 + rem2)) % 2 == 0- 这是因为要删除 rem1 字符和要添加 rem2 字符。如果两者之和小于k,则视情况而定。

在这里,(k - (rem1 + rem2)) 会给你额外的 k。这个额外的可以或不能取决于它是否能被 2 整除。在这里,我们执行 %2,因为我们的问题中有 2 操作 - deleteappend。如果 额外的 k 没有完成任何操作,则答案为No,否则为Yes

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

【讨论】:

    猜你喜欢
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 2017-07-24
    • 2012-06-11
    • 2013-04-03
    • 2020-02-25
    • 1970-01-01
    相关资源
    最近更新 更多