Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 通过执行精确的K操作将字符串S转换为另一个字符串T(在字符串S的末尾追加/删除)_String_Algorithm_Logic - Fatal编程技术网

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