1 条题解

  • 0
    @ 2026-10-18 18:37:35

    G4007 [GESP202403 四级] 相似字符串 题解

    知识点:字符串、双指针、分类讨论。

    解题思路

    长度差超过1立即失败。等长时最多允许一个不同位置;相差1时用双指针,只允许在较长串中跳过一个字符。

    为什么正确

    一次替换只能改变一个等长位置,一次增删只能造成一个对齐偏移,两个分支正好覆盖允许的修改。

    易错点

    两个串完全相同也属于similar;较长串末尾多出的字符同样计入一次跳过。

    复杂度

    每组时间O(len(a)+len(b)),空间O(len(a)+len(b))。

    参考代码(C++17)

    #include<bits/stdc++.h>
    
    using namespace std;
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        int t;
        cin>>t;
        while(t--) {
            string a,b;
            cin>>a>>b;
            if(a.size()<b.size())swap(a,b);
            bool ok=true;
            if(a.size()>b.size()+1)ok=false;
            else if(a.size()==b.size()) {
                int c=0;
                for(int i=0;i<(int)a.size();i++)c+=a[i]!=b[i];
                ok=c<=1;
            }
            else {
                int i=0,j=0,c=0;
                while(i<(int)a.size()) {
                    if(j<(int)b.size()&&a[i]==b[j]) {
                        i++;
                        j++;
                    }
                    else {
                        i++;
                        c++;
                    }
                }
                ok=c<=1;
            }
            cout<<(ok?"similar":"not similar")<<"\n";
        }
    }
    

    说明

    本题解为配套教学整理,非官方题解。复杂度按本页参考实现计算,题库使用8个自行生成的测试点。

    • 1

    信息

    ID
    703
    时间
    1000ms
    内存
    512MiB
    难度
    进阶
    标签
    递交数
    1
    已通过
    1
    上传者