忧默的小男孩 2022-09-07 17:39 采纳率: 94.4%
浏览 52
已结题

c++中字符串最大扭矩的问题

有的答案正确,有的答案超时,但是答案都不对,不超时的那个 我是借鉴了一下输入样例,样例中有两个ef,答案应该是第二个ef和ab的跨距,而我的代码的答案是第一个ef与ab的跨距,不知道哪里不对,我单独输出了一下t1和t2,t1总是对的,t2都不对,而且单纯输出t2还有可能超时,所以应该是包含t2循环的错误,但是我找不出来,不要新写的代码,想知道错误在哪,有没有会debug的,可以弄一下,我不会

img

img

img


#include <iostream>
#include <cstdio>
#include <cstring>
#include <sstream>

using namespace std;

int main(){
    string s,s1,s2,s3;
    int x;
    cin >> s;
    int z=s.size();
    for(int i=0;i<z;i++){
        if(s[i]==',') break;
        s1=s1+s[i];
        x=i;
    }
    for(int i=x+2;i<z;i++){
            if(s[i]==',') break;
            s2=s2+s[i];
            x=i;
    }
    for(int i=x+2;i<z;i++){
        s3=s3+s[i];                     //上面三个for循环的作用是把三个字符串分别提出来,已经测试过没有问题
    }
        int z1=s1.size(),z2=s2.size(),z3=s3.size();
        int t1=0,flag1=0;
    for(int i=0,j=0,count=0;i<z1;i++,j++){
        if(s1[i]==s2[j%z2]){
        count++;
        }
        if(count==z2){
        flag1=1;
        t1=i;                               //这个for循环的作用是找出s1在s中的第一个位置并将其最后一个字母在s中的坐标赋给t1
        break;
        }
        if (s1[i]!=s2[j]){
        i=i-count;
        count=0;
        j=j-count-1;
        }
    }                                       
        int t2=0,flag2=0;
     for(int i=0,j=0,count=0;i<z1;i++,j++){
        if(s1[i]==s3[j%z3]) 
        count++;
        if(count==z3){
        flag2=1;
        t2=i-count+1;
        i=i-count+1;
        j=-1;
        }                           //这个for循环的作用是找出s2在s中的最后一个位置并将其最后一个位置的首字母在s中的坐标赋给t2
        if(s1[i]!=s3[j]){           //因为要找最后一个s2在s中出现的位置,所以即使找到了相匹配的字符,我还是把坐标减到匹配之前的位置上
        i=i-count;                  //然后结尾的时候i会自增1,所以相当于从匹配的字符的首字母的坐标的下一个坐标继续开始匹配,直到达到z1
        count=0;
        j=j-count-1;
        }
    }
       int length=t2-t1-1;
    if(flag1==0 || flag2==0 || length<0)
    cout << "-1";
    else 
    cout << length;
}
  • 写回答

5条回答 默认 最新

  • 关注

    同一个题啊,刚改完代码

    img

    代码修改如下:

    #define _CRT_SECURE_NO_WARNINGS
    
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <sstream>
    
    using namespace std;
    
    int main() {
        string s, s1="", s2="", s3="";
        int x;
        cin >> s;
        int z = s.size();
        for (int i = 0; i < z; i++) {
            if (s[i] == ',') break;
            s1 = s1 + s[i];
            x = i;
        }
        for (int i = x + 2; i < z; i++) {
            if (s[i] == ',') break;
            s2 = s2 + s[i];
            x = i;
        }
        for (int i = x + 2; i < z; i++) {
            s3 = s3 + s[i];
        }
        int z1 = s1.size(), z2 = s2.size(), z3 = s3.size();  //修改
        int t1 = 0, flag1 = 0;
        for (int i = 0, j = 0, count = 0; i < z1 && j<z2; i++, j++) { //修改
            if (s1[i] == s2[j]) { //修改
                count++;
            }
            if (count == z2) {
                flag1 = 1;
                t1 = i;
                break;
            }
            if (s1[i] != s2[j]) {  //修改  s2从头开始
                //i = i - count;
                count = 0;
                //j = j - count - 1;
                j = -1;
            }
        }
        //s3应该从s1的最右侧开始判断
        int t2 = 0, flag2 = 0;
        int tmp = z1-z3;
        for (int i = z1-z3, j = 0, count = 0; i >= 0 && j < z3; i++, j++) { //修改
            
            if (s1[i] == s3[j])
                count++;
            if (count == z3) {
                flag2 = 1;
                t2 = i - count + 1;
                break;
                //i = i - (count - 1);
                //count = 0;
            }
            if (s1[i] != s3[j]) {
                //i = i - count;
                tmp--; //tmp前移
                i = tmp - 1; //i 前移
                count = 0;
                //j = j - count - 1;
                j = -1;
            }
        }
        if (flag1 == 1 && flag2 == 1 && t2 > t1)
        {
            int length = t2 - t1 - 1;
            cout << length;
        }
        else
            cout << "-1";
        return 0;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 9月13日
  • 已采纳回答 9月13日
  • 创建了问题 9月7日

悬赏问题

  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因