您现在的位置是:首页 > 编程 > 

数组中两个字符串的最小距离问题

2025-07-18 21:47:06
数组中两个字符串的最小距离问题 一·题目:牛客网题目链接:数组中两个字符串的最小距离_牛客题霸_牛客网 二·思路:一开始就是二话没想看到时间复杂度是o()就想到肯定不能直接来回遍历去寻,于是就想到把出现str1和str2下标记录下来然后去比较差值。于是,就搞了,下面复杂版的代码后面展示,不过这里更推荐下面的那种简单的解法这里有简单的思路也就是后面看了大佬的题解才发现利用指针记录下标完全把问题简

数组中两个字符串的最小距离问题

一·题目:

牛客网题目链接:数组中两个字符串的最小距离_牛客题霸_牛客网

二·思路:

一开始就是二话没想看到时间复杂度是o()就想到肯定不能直接来回遍历去寻,于是就想到把出现str1和str2下标记录下来然后去比较差值。于是,就搞了,下面复杂版的代码后面展示,不过这里更推荐下面的那种简单的解法

这里有简单的思路也就是后面看了大佬的题解才发现利用指针记录下标完全把问题简单话了,下面看一下具体思路:

思路:主要说下写法1:即它说复杂度要o(n)故也就是对这个strs只能走一遍,因此,还要判断str1,str2的下标最小值,故这里用个min函数,也就说最优就是当我们遍历的时候就边比较距离并求min,只要遇到str1,str2就记录,i每动一次,就有可能导致下标变化因此就可能导致求min,注:绝对值求距离。

三·代码:.1复杂版解答:代码语言:javascript代码运行次数:0运行复制
#include <iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<set>
using namespace std;



int main() {
    int ret = 0xffff;//整型最大值
    int n;
    cin >> n;
    getchar();//读取cin剩下的\n
    string str1, str2;
    getline(cin, str1, ' ');
    getline(cin, str2);//由题可知是\n为最后一个终止符
    vector<string> strs;
    for (int i = 0; i < n; i++) {
        string s;
        getline(cin, s);
        strs.push_back(s);
    }
    int flag1 = 0, flag2 = 0;
    for (int i = 0; i < strs.size(); i++) {//判断是否在strs都出现了
        if (str1 == strs[i]) flag1 = 1;
        if (str2 == strs[i]) flag2 = 1;
    }
    if (flag1 == 1 && flag2 == 1) {
        set<int> v1, v2;
        //使用set对下标排序:
        for (int j = 0; j < strs.size(); j++) {
            if (strs[j] == str1) {
                v1.insert(j);

            }
            if (strs[j] == str2) {
                v2.insert(j);


            }
        }
        set<int> s, f;

        if (v1.size() < v2.size()) s = v1, f = v2;
        else s = v2, f = v1;
        for (auto a : s) {
            //这里遍历短的那个下标数组,去长的中比它大或比它小,差就有可能是
            auto cur = f.upper_bound(a);
            if (cur != f.begin()) {
                auto tmp = --cur;//set支持双向迭代器,会改变cur
                cur++;
                ret = min(ret, abs(*(tmp) - a) > abs(*(cur) - a) ? abs(*(cur) - a) : abs(*
                          (tmp) - a));
            } else ret = min(ret, *(cur) - a);
        }

    }
    if (ret != 0xffff) cout << ret << endl;
    else cout << -1 << endl;

}
.2优化版本:代码语言:javascript代码运行次数:0运行复制
#include <iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<set>
using namespace std;
int main() {
    int n;
   cin>>n;
   getchar();
   string str1,str2;
   getline(cin,str1,' ');
   getline(cin,str2);
   vector<string> v(n);
   int ret=0xffff;
   int pre1=-1,pre2=-1;
   for(int i=0;i<n;i++) cin>>v[i];
   for(int i=0;i<n;i++){
     if(v[i]==str1) pre1=i;
     if(v[i]==str2) pre2=i;
     if(pre1!=-1&&pre2!=-1) ret=min(ret,abs(pre1-pre2));
   }
   if(pre1==-1||pre2==-1) cout<<-1<<endl;//存在str1或者str2中的一个也是-1
   else cout<<ret<<endl;



}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2025-01-2,如有侵权请联系 cloudcommunity@tencent 删除字符串includeint遍历数组

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1131777.html

相关标签:无
上传时间: 2025-07-18 19:31:42
留言与评论(共有 15 条评论)
本站网友 营口造纸厂
6分钟前 发表
pre2=-1; for(int i=0;i<n;i++) cin>>v[i]; for(int i=0;i<n;i++){ if(v[i]==str1) pre1=i; if(v[i]==str2) pre2=i; if(pre1!=-1&&pre2!=-1) ret=min(ret
本站网友 360推广
30分钟前 发表
' '); getline(cin
本站网友 呀呀插画
29分钟前 发表
就搞了
本站网友 河津租房
8分钟前 发表
pre2=-1; for(int i=0;i<n;i++) cin>>v[i]; for(int i=0;i<n;i++){ if(v[i]==str1) pre1=i; if(v[i]==str2) pre2=i; if(pre1!=-1&&pre2!=-1) ret=min(ret
本站网友 贫困县名单
13分钟前 发表
v2; //使用set对下标排序: for (int j = 0; j < strs.size(); j++) { if (strs[j] == str1) { v1.insert(j); } if (strs[j] == str2) { v2.insert(j); } } set<int> s
本站网友 北京抑郁症医院
19分钟前 发表
abs(* (tmp) - a)); } else ret = min(ret
本站网友 发帖赚钱
18分钟前 发表
还要判断str1
本站网友 青州租房信息
13分钟前 发表
数组中两个字符串的最小距离问题 一·题目:牛客网题目链接:数组中两个字符串的最小距离_牛客题霸_牛客网 二·思路:一开始就是二话没想看到时间复杂度是o()就想到肯定不能直接来回遍历去寻
本站网友 奋斗说人生就是
30分钟前 发表
分享自作者个人站点/博客
本站网友 批量打印软件
28分钟前 发表
str2; getline(cin
本站网友 湖南铁道
9分钟前 发表
str1
本站网友 ds1302
15分钟前 发表
故这里用个min函数
本站网友 西餐美食网
8分钟前 发表
于是
本站网友 瘦身魔方
26分钟前 发表
str1