给定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 ;
}