String 通过执行精确的K操作将字符串S转换为另一个字符串T(在字符串S的末尾追加/删除)
我正在努力解决一个问题。但我错过了一个角落的案子。请帮帮我。问题陈述是: 您有一个由小写英文字母组成的字符串,String 通过执行精确的K操作将字符串S转换为另一个字符串T(在字符串S的末尾追加/删除),string,algorithm,logic,String,Algorithm,Logic,我正在努力解决一个问题。但我错过了一个角落的案子。请帮帮我。问题陈述是: 您有一个由小写英文字母组成的字符串,S。您可以在S上执行两种类型的操作: 在字符串末尾附加一个小写英文字母 删除字符串中的最后一个字符。对空字符串执行此操作将导致空字符串 给定一个整数,k,以及两个字符串,s和t,通过对s执行上述操作中的恰好k,确定是否可以将s转换为t 如果可能,请打印“是”;否则,请打印“否” Examples Input Output hackerhappy Yes h
S
。您可以在S
上执行两种类型的操作:
k
,以及两个字符串,s
和t
,通过对s
执行上述操作中的恰好k
,确定是否可以将s
转换为t
如果可能,请打印“是”;否则,请打印“否”
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;int tl=strlen(t);int-diffi=0;
int i;
对于(i=0;s[i]&&t[i]&&s[i]==t[i];i++)//直到匹配
diffi=i;
((sl diffi+tl diffi您还需要将剩余的操作划分为2,因为您只需添加和删除字母即可浪费操作
所以也许:
//c语言-strcmp(s,t)如果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");
if(strcmp(s,t))
((sl-diffi+tl-diffi您可以使用二进制搜索的另一种方法
取长度较小的字符串,并取长度为/2的子字符串(模式)
1.如果获得匹配项,则对两个字符串执行二进制搜索(按字符),如果匹配项,则在模式中追加长度/4个字符,如果匹配项,则在模式中追加长度/2^n,否则在原始字符串中追加一个字符(长度/2的模式),然后重试
2.如果您得到长度为/2的图案不匹配,请将图案长度减少到长度/4,如果您得到匹配,请追加下一个字符
现在重复步骤1和2
如果n1+n2这适用于所有情况:
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");
intsl=strlen(s);inttl=strlen(t);intdiffi=0;
int i,m;
for(i=0;s[i]&&t[i]&&s[i]==t[i];i++);//直到匹配
diffi=i;
m=sl+tl-2*diffi;
((k>=m&&(k-m)%2==0)| | |(sl+tlSo)你的问题是什么?你的算法行吗?如果不行,找一个反例。试试你的算法a)在纸上用手或b)使用调试器找出算法哪里出了问题。@MrSmith42,我试过了,但我遗漏了一些角情况,我不知道“角情况”的示例在哪里,调试的结果是什么?它说的正是k个操作,所以你应该为(abc,abd,3)返回FALSE@Smith42先生,我正在一个在线编程平台上解决这个问题,我不知道测试用例。好的,我会尝试更多的测试用例,然后回来。注意,如果k>strlen(s)+strlen(t),除以2规则不适用
,因为删除所有字符后,使用“从空字符串中删除”规则可能会浪费奇数个操作。
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
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");