题目链接(牛客)
备用:https://www.nowcoder.com/practice/2c6a0a8e1d20492f92941400036e0890
题目
解题思路
我们可以用两层for循环暴力解法但是题目要求时间复杂度小于O(n)所以我们要想其他方法
我们可以这样以示例二为例
-
1.我们定义两个变量用来存储下标,,两个变量默认值为-1因为如果strs里面没有str1或str2的时候返回-1,遇到对应查找的str1和str2更新变量如下图
-
2.之后两个变量都找到下标的时候求距离,这样一层for循环就能办到
代码
我的代码比较麻烦其实哈可以简化,其实可以不用数组储存,直接用一个string每读取一个字符串进行一次循环判断更好
#include <iostream>
#include <string>
using namespace std;
int main() {
string strs[100010];
string str1, str2;
int n, mark1, mark2, ret;
cin >> n;
ret = n;
mark1 = -1, mark2 = -1;
cin >> str1 >> str2;
for (int i = 0; i < n; i++)
cin >> strs[i];
for (int i = 0; i < n; i++) {
if (str1 == strs[i])
{
if(mark2!=-1)
ret=min(ret,i-mark2);
mark1=i;
}
if (str2 == strs[i])
{
if(mark1!=-1)
ret=min(ret,i-mark1);
mark2=i;
}
}
if(ret==n)
cout << -1 << endl;
else
cout << ret << endl;
}