给定一个字符串数组strs,再给定两个字符串str1和str2,返回在strs中str1和str2的最小距离,如果str1或str2为null,或不在strs中,返回-1。
输入描述:
输入包含有多行,第一输入一个整数n(1 ≤ n ≤ 10^5),代表数组strs的长度,第二行有两个字符串分别代表str1和str2,接下来n行,每行一个字符串,代表数组strs(保证题目中出现的所有字符串长度均小于等于10)
输出描述:
输出一行,包含一个整数,代表返回的值。
补充说明:
时间复杂度O(n),额外空间复杂度O(1)
解法一:暴力解法(这里不举例)
解法二:贪心(dp)
prev 存放最近的数值下标
示例1:
输入:1
CD AB
CD
输出: -1
示例2:
输入:5
QWER 666
QWER
1234
qwe
666
QWER
输出: 1
#include <iostream>
using namespace std;
#include <string>
int main()
{
int n;
int prev1 = -1, prev2 = -1,ret = -1;
string s1, s2;
string s;
cin >>n;
cin >>s1 >> s2;
for (int i = 0; i < n; i++)
{
cin >> s;
if(s == s1) //去前面找最近的s2
{
if(prev2 != -1)
{
ret = min(ret, i - prev2);
}
prev1 = i;
}
else
{
if (prev1 != -1)
{
ret = min(ret, i - prev1);
}
prev2 = i;
}
}
if(ret == -1)
{
cout << -1 << endl;
}
else
{
cout << ret << endl;
}
return 0;
}
输出结果: