我正在努力解决问题。但我错过了一些角落案例。请帮我。问题陈述是:
您有一个小写英文字母的字符串S
。您可以在S
上执行两种类型的操作:
给定一个整数k
和两个字符串s
和t
,确定您是否可以将s
转换为t
在exactly k
上执行上述操作的s
。
如果可能,请打印是;否则,打印编号
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");
请帮我解决这个问题。
谢谢
答案 0 :(得分:1)
你还需要将剩下的操作划分为2,因为你只需添加和删除字母就可以浪费操作。
所以也许:
// c language - 如果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");
答案 1 :(得分:0)
您可以使用二分查找再做一次。
取较小长度的字符串并取长度为2的子字符串(模式)。
1.对两个字符串进行二进制搜索(按字符)如果你得到一个匹配附加长度/ 4个字符到模式如果匹配则按长度添加更多/ 2 ^ n否则将一个字符附加到原始字符串(长度/ 2的模式)并尝试。
2.如果长度/ 2的模式不匹配,则将模式的长度减少到长度/ 4,如果你得到匹配,则追加下一个字符。
现在重复步骤1和2
如果n1 + n2 <= k,则答案为是 否则答案是否
示例:
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
答案 2 :(得分:0)
这适用于所有情况:
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");