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

时间:2016-11-01 12:15:44

标签: string algorithm logic

我正在努力解决问题。但我错过了一些角落案例。请帮我。问题陈述是:

您有一个小写英文字母的字符串S。您可以在S上执行两种类型的操作:

  1. 在字符串的末尾附加一个小写的英文字母。
  2. 删除字符串中的最后一个字符。对空字符串执行此操作会导致空字符串。
  3. 给定一个整数k和两个字符串st确定您是否可以将s转换为texactly 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");
    

    请帮我解决这个问题。

    谢谢

3 个答案:

答案 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");