1、问题介绍
给定两个英语单词,要找两个英语单词之间,第一个英语字母交集的地址,如果存在交集,则输出交集的地址,如果不存在交集,则输出-1。
2、输入样例
输入:
00001 00002 4
00001 a 10001
10001 s -1
00002 a 10002
10002 t -1
输出:
-1
输入:
11111 22222 9
67890 i 00002
00010 a 12345
00003 g -1
12345 D 67890
00002 n 00003
22222 B 23456
11111 L 00001
23456 e 67890
00001 o 00010
输出:
67890
3、思路
主要思路为,遍历第一个单词,让每个字母的flag赋值为true,再遍历第二个单词,当遇到某个字母的flag为true时,就代表找到了。这比把两个单词都打印出来,然后再使用二重循环对比快多了。
4、代码实现
#include<iostream>
using namespace std;
#define MaxSize 100010
struct Node{
char data;
int next;
bool flag;
}node[MaxSize];
int main(){
bool flag = false;
int result;
int s1,s2,n;
cin >> s1 >> s2 >> n;
while(n--){
int address,next;
char data;
cin >> address >> data >> next;
node[address].data = data;
node[address].next = next;
node[address].flag = false;
}
//遍历链表一
while(node[s1].next != -1){
node[s1].flag = true;
s1 = node[s1].next;
}
//遍历链表二
while(node[s2].next != -1){
if(node[s2].flag){
result = s2;
flag = true;
break;
}
s2 = node[s2].next;
}
if(flag){
//找到了
cout << result;
}else{
cout << -1;
}
return 0;
}