通过执行精确的 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
和两个字符串s
和t
,判断是否可以通过对上述操作执行exactly k
将s
转换为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 > 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 的末尾追加/删除)的主要内容,如果未能解决你的问题,请参考以下文章