C++ 字符串最大跨距

有三个字符串 S,S1,S2
,其中,S
长度不超过 300
,S1
和 S2
的长度不超过 10

现在,我们想要检测 S1
和 S2
是否同时在 S
中出现,且 S1
位于 S2
的左边,并在 S
中互不交叉(即,S1
的右边界点在 S2
的左边界点的左侧)。

计算满足上述条件的最大跨距(即,最大间隔距离:最右边的 S2
的起始点与最左边的 S1
的终止点之间的字符数目)。

如果没有满足条件的 S1
,S2
存在,则输出 −1

例如,S=
abcd123ab888efghij45ef67kl, S1=
ab, S2=
ef,其中,S1
在 S
中出现了 2
次,S2
也在 S
中出现了 2
次,最大跨距为:18

输入格式
输入共一行,包含三个字符串 S,S1,S2
,字符串之间用逗号隔开。

数据保证三个字符串中不含空格和逗号。

输出格式
输出一个整数,表示最大跨距。

如果没有满足条件的 S1
和 S2
存在,则输出 −1

输入样例:
abcd123ab888efghij45ef67kl,ab,ef
输出样例:
18

#include 
#include 

using namespace std;

int main ()
{
    string S;
    cin>>S;
    string s, s1, s2;
    int n  = 0;
    int pos[2];
    for(int i = 0; i < S.size(); i ++) {
        if(S[i] == ',') {
            pos[n] = i;
            n ++;
        }
    }
    s = S.substr(0, pos[0]);
    s1 = S.substr(pos[0] + 1, pos[1] - pos[0] - 1);
    s2 = S.substr(pos[1] + 1);
    int res = -1;
    int exit = 0;
    int maxpos = 0;
    for(int i = 0; i < s.size(); i ++) {
        if(s.substr(i, s1.size()) == s1) {
            // exit == 1;
            int j = i + s1.size();
            string rights = s.substr(j);
            //cout<<"rights:"<
            for(int t =0; t < rights.size(); t ++) {
                if(rights.substr(t, s2.size()) == s2) {
                    //cout<
                    maxpos = t;
                    exit = 1;
                }
            }
        break;
        }
    }

    if(!exit)
        cout<<"-1"<<endl;
    else
        cout<<maxpos<<endl;
    
    return 0;
}

主要是模拟取子串,s1从前面去第一个,s2取去掉第一个s1的最后一个,返回位置即可。

你可能感兴趣的:(力扣,字符串,c++,算法)