← 返回题目页

A1342 [GESP-4.2403.T1] 相似字符串

标程

#include <bits/stdc++.h>
using namespace std;

// GESP-4.2403.T1 相似字符串(A1342)
//
// 相似 = 最多一次「插入 / 删除 / 修改」。
// 长度差 > 1 直接不行;长度相同看有几个位置不同;长度差 1 用双指针跳过一个字符。
bool similar(const string& a, const string& b) {
    int n = (int)a.size(), m = (int)b.size();
    if (abs(n - m) > 1) return false;
    if (n == m) { // 长度相同:最多一个位置不同(修改)
        int diff = 0;
        for (int i = 0; i < n; i++) {
            if (a[i] != b[i]) {
                diff++;
                if (diff > 1) return false;
            }
        }
        return true;
    }
    const string& s = (n > m ? a : b); // 长的
    const string& t = (n > m ? b : a); // 短的
    int i = 0, j = 0, diff = 0;
    while (i < (int)s.size() && j < (int)t.size()) {
        if (s[i] == t[j]) {
            i++;
            j++;
        } else {
            diff++; // 跳过长的那一个字符(相当于删除)
            if (diff > 1) return false;
            i++;
        }
    }
    return diff + (int)(s.size() - i) + (int)(t.size() - j) <= 1;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int T;
    cin >> T;
    while (T--) {
        string a, b;
        cin >> a >> b;
        cout << (similar(a, b) ? "similar" : "not similar") << "\n";
    }
    return 0;
}

动画演示