1. 程式人生 > >計蒜客後綴字符串題解

計蒜客後綴字符串題解

字符串 substr 思路 nbsp std 所有 暴力 urn span

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

計蒜客後綴字符串題解