计蒜客后缀字符串题解

给定N个字符串Si,判断这N个字符串中以Si作为的后缀的有几个

1.暴力解法

  主要学习的是下标的使用,我最初看到后缀,总会想着让待比较的字符串的下表从后往前移动,然后还要判断越界等问题,很复杂。

  这里将长度记录下来,然后进行比较,比较直观。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const LL mod = 1e9 + 7;
const int N = 100005;
string a[N];
int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    for (int i = 0; i < n; i++) {
        int ans = 0;
        for (int j = 0; j < n; j++) {
            if (a[j].size() < a[i].size()) continue;
            int pos = a[j].size() - a[i].size();  //***先记录长度差 
            int ok = 1;
            for (int k = 0; k < a[i].size(); k++) {
                if (a[j][pos + k] != a[i][k]) {
                    ok = 0;
                    break;
                }
            }
            ans += ok;
        }
        cout << ans << endl;
    }
    return 0;
}

思路是 使用map 将所有的后缀都保存起来 (我想不出来。。)

处理每一个字符串,把它的所有可能出现的后缀都存在于map中

#include<iostream>
#include<map>
using namespace std;
const int N = 100005;
string a[N];
int main ()  {
    map<string, int> mp;
    int n;
    cin >> n;
	for (int i = 0; i < n; i++) {
        cin >> a[i];
        for (int j = 0; j < a[i].size(); j++) {
            mp[a[i].substr(j)]++;
        }
    }
    for(int i = 0; i < n;i++) {
        cout << mp[a[i]] << endl;
    }
    return 0 ;
}

猜你喜欢

转载自www.cnblogs.com/dcklm/p/10344903.html
今日推荐