通过执行精确的 K 操作将字符串 S 转换为另一个字符串 T(从字符串 S 的末尾追加/删除)

Posted

技术标签:

【中文标题】通过执行精确的 K 操作将字符串 S 转换为另一个字符串 T(从字符串 S 的末尾追加/删除)【英文标题】:Convert string S to another string T by performing exactly K operations (append to / delete from the end of the string S) 【发布时间】:2017-03-14 13:57:37 【问题描述】:

我正在尝试解决一个问题。但我错过了一些极端情况。请帮我。问题陈述是:

您有一个字符串 S ,由小写英文字母组成。你可以对S进行两种操作:

    在字符串末尾附加一个小写英文字母。 删除字符串中的最后一个字符。对空字符串执行此操作会产生空字符串。

给定一个整数k和两个字符串st判断是否可以通过对上述操作执行exactly ks转换为t s.

如果可能,打印 Yes;否则,打印编号。

Examples 
Input           Output

hackerhappy     Yes
hackerrank
9

5 delete operations (h,a,p,p,y) and 4 append operations (r,a,n,k)

aba             Yes
aba
7

4 delete operations (delete on empty = empty) and 3 append operations

我尝试过这种方式(C语言):

int sl = strlen(s); int tl = strlen(t); int diffi=0;  

int i;
for(i=0;s[i]&&t[i]&&s[i]==t[i];i++); //going till matching
diffi=i;  

((sl-diffi+tl-diffi<=k)||(sl+tl<=k))?printf("Yes"):printf("No");

请帮我解决这个问题。

谢谢

【问题讨论】:

那么你的问题是什么?你的算法有效吗?如果没有,请找一个反例。尝试您的算法 a) 在纸上手写或 b) 使用调试器找出算法出错的地方。 @MrSmith42,我试过了,但我错过了一些极端情况,我没有得到 “极端情况”的示例在哪里,调试的结果是什么? 它说 完全 k 个操作,所以你应该为 (abc,abd,3) 返回 FALSE @MrSmith42,我正在在线编程平台上解决这个问题,我不知道测试用例。好的,我会尝试更多的测试用例,然后回来。 【参考方案1】:

你还需要将剩余的操作一分为二,因为你只需要添加和删除字母就浪费了操作。

也许:

// c 语言 - 如果 s==t,strcmp(s,t) 返回 0。

if(strcmp(s,t))
    ((sl-diffi+tl-diffi<=k && (k-(sl-diffi+tl-diffi))%2==0)||(sl+tl<=k))?printf("Yes"):printf("No");
else 
   if(sl+tl<=k||k%2==0) printf("Yes"); else printf("No");

【讨论】:

请注意,如果k &gt; strlen(s) + strlen(t),则除以 2 规则不适用,因为当您删除所有字符时,使用从空字符串中删除规则可能会浪费奇数次操作。【参考方案2】:

您可以使用二分搜索的另一种方法。

取长度较小的字符串,取长度为/2的子字符串(模式)。

1.如果你得到一个匹配,则对两个字符串进行二进制搜索(按字符),如果匹配,则向模式追加长度/4 个字符,按长度/2^n 增加更多字符,否则将一个字符追加到原始字符(长度/2的模式)并尝试。

2.如果你得到一个长度/2的模式不匹配,将模式的长度减少到长度/4,如果你得到一个匹配,则追加下一个字符。

现在重复步骤 1 和 2

如果 n1+n2

例子:

s1=Hackerhappy
s2=Hackerrank
pattern=Hacker // length = 10 (s2 is smaller and length of s2=10 length/2 =5)
//Do a binary search of the pattern you will get a match by steps 1 and 2
n1 number of mismatched characters is 5 
n2 number of mismatched characters is 4

Now n1+n2<k // its because we will need to do these much operation to make these to equal.
So Yes

【讨论】:

【参考方案3】:

这应该适用于所有情况:

int sl = strlen(s); int tl = strlen(t); int diffi=0;  

int i,m;
for(i=0;s[i]&&t[i]&&s[i]==t[i];i++); //going till matching
diffi=i; 
m = sl+tl-2*diffi;

((k>=m&&(k-m)%2==0)||(sl+tl<=k))?printf("Yes"):printf("No");

【讨论】:

以上是关于通过执行精确的 K 操作将字符串 S 转换为另一个字符串 T(从字符串 S 的末尾追加/删除)的主要内容,如果未能解决你的问题,请参考以下文章

如何将Java类转换为另一个类

将 stdClass 对象转换/转换为另一个类

如何通过元素的属性将集合转换/转换为另一个集合?

java编程:输入一个字符串,将其转换为另一个字符串。

如何将字符串类型的日期转换为另一种日期格式。 |颤振 |飞镖[重复]

Python pytz 将时间戳(字符串格式)从一个时区转换为另一个时区