解法一:链表+Map
用 Map
存储结点,进一步构造结点链表,找出有两个前序的结点即为公共后缀的起点。
注意考虑两个字符串的头结点一致的边界情况。
#include <bits/stdc++.h>
using namespace std;
class Node {
public:
string address;
char data;
string next_address;
Node *next;
Node *pre;
Node(string address, char data, string next_address) : address(address),
data(data),
next_address(next_address),
pre(nullptr) {}
};
map<string, Node> nodeMap;
int main() {
string first, last;
int N;
cin >> first >> last >> N;
string address, next;
char data;
for (int i = 0; i < N; ++i) {
cin >> address >> data >> next;
nodeMap.emplace(address, Node(address, data, next));
}
if (first==last) {
cout << first << '\n';
return 0;
}
for (auto &it:nodeMap) {
auto nextPair = nodeMap.find(it.second.next_address);
if (nextPair != nodeMap.end()) {
it.second.next = &nextPair->second;
if (nextPair->second.pre == nullptr) {
nextPair->second.pre = &it.second;
} else {
cout << nextPair->second.address << '\n';
return 0;
}
} else {
it.second.next = nullptr;
}
}
cout << "-1\n";
}