推广平台开户代理郴州seo网络优化
链接:数组中两个字符串的最小距离__牛客网
来源:牛客网
遍历数组,更新位置与距离:
遍历数组中的每个字符串:
- 若当前字符串是
str1
,更新prev1
为当前位置。若str2
已出现过(prev2 != -1
),计算两者距离并更新最小距离ret
。 - 若当前字符串是
str2
,更新prev2
为当前位置。若str1
已出现过(prev1 != -1
),计算距离并更新ret
。
关键点:
- 单次遍历:通过维护两个指针
prev1
和prev2
,在遍历过程中动态更新最近位置,确保时间复杂度为O(n)。 - 实时计算:每次遇到
str1
或str2
时,立即计算与另一字符串的当前最近距离,避免遗漏可能的更优解。 - 边界处理:若任一字符串未出现,直接返回-1,符合题意。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>using namespace std;int main()
{int n = 0;cin >> n;string str1, str2;cin >> str1 >> str2;vector<string> strs;for (int i = 0; i < n; i++){string temp;cin >> temp;strs.push_back(temp);}int prev1 = -1;int prev2 = -1;int ret = n;for (int i = 0; i < strs.size(); i++){if (str1.compare(strs[i]) == 0){prev1 = i;if (prev1 != -1 && prev2 != -1){if (ret > abs(prev2 - prev1)){ret = abs(prev2 - prev1);}}}else if (str2.compare(strs[i]) == 0){prev2 = i;if (prev1 != -1 && prev2 != -1){if (ret > abs(prev2 - prev1)){ret = abs(prev2 - prev1);}}}}if (prev1 == -1 || prev2 == -1){cout << -1 << endl;}else{cout << ret << endl;}return 0;
}