前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >数组中两个字符串的最小距离问题

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

作者头像
用户11458826
发布于 2025-01-23 09:10:06
发布于 2025-01-23 09:10:06
4200
代码可运行
举报
文章被收录于专栏:杀马特杀马特
运行总次数:0
代码可运行

一·题目:

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

二·思路:

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

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

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

三·代码:

3.1复杂版解答:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<set>
using namespace std;



int main() {
    int ret = 0x3f3f3f3f;//整型最大值
    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 != 0x3f3f3f3f) cout << ret << endl;
    else cout << -1 << endl;

}

3.2优化版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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=0x3f3f3f3f;
   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-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【C++笔试强训】如何成为算法糕手Day2
(1)快递不加急且小于20kg; (2)快递加急且小于20kg; (3)快递不加急且大于20kg; (4)快递加急且大于20kg;
小文要打代码
2024/10/16
1090
【C++笔试强训】如何成为算法糕手Day2
算法思想总结:字符串
思路1:两两比较 时间复杂度mn 实现findcomon返回两两比较后的公共前缀
小陈在拼命
2024/07/16
890
算法思想总结:字符串
48days强训——day2
先判断快递重量a,若a<=1,基础费用为 20 元;若a>1,超出 1kg 部分向上取整,按每千克 1 元计算,再加上 20 元得到基础费用,接着根据字符 b 判断是否加。
秋邱
2025/03/25
370
48days强训——day2
九度OJ——1009二叉搜索树
题目描述: 判断两序列是否为同一二叉搜索树序列 输入: 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。 接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。 接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。 输出: 如果序列相同则输出YES,否则输出NO 样例输入: 2 567432 543267 576342 0 样例输出: YES NO
AI那点小事
2020/04/18
4390
【C++】 —— 笔试刷题day_2
题目要求:给定一个数组cost,其表示从这个位置离开需要的花费,(可以选择上一步或者两步);需要我们求出到达顶部的最低花费。
星辰与你
2025/03/12
370
【C++】 —— 笔试刷题day_2
线性dp
f[i][j]表示从开始的位置到i,j位置的路径之和的最大值。 因为f[i][j]是要求的那个,所以我们要求出它的状态方程 f[i][j]=max(f[i-1][j-1]+a[i][j],f[i-1][j]+a[i][j]) ok,现在开始我们做这道题
code-child
2023/05/30
2430
最长公共子串+最长公共子序列
1、先建立一个二维数组array[str1.size()][str2.size()](全部初始化为0),初始化第一行和第一列(元素相同处置1),然后进入状态方程
xiaoxi666
2018/10/29
2.6K0
给定一个字符串,问是否能通过添加一个字母将其变为回文串(三种思路)
题目描述 给定一个字符串,问是否能通过添加一个字母将其变为回文串。 输入描述 一行一个由小写字母构成的字符串,字符串长度小于等于10。 输出描述 输出答案(YES\NO). 示例 输入coco,输出YES. 思路 1.常规方法,先判断整体是否回文,若整体回文,可以在中间加一个数,直接返回YES。如果整体不是回文,依次去掉一个字符后判断剩下的字符串是否为回文串,时间复杂度O(n^2)。如abcddecba:1.去掉a,判断bcddecba;2.去掉b,判断acddecba;3.去掉c,判断abddecba
xiaoxi666
2018/10/29
1.4K0
UCF Local Programming Contest 2015 A~~H
题目链接 A 水题: #include<bits/stdc++.h> #define inf 0x3f3f3f3f using namespace std; int a[15]; int main(){ int t; cin>>t; while(t--){ bool flag1 =0; bool flag2 =0; for(int i=1;i<=10;i++){ cin>>a[i]; if(a[i] == 18) flag1 = 1; if(a[i] == 17)
杨鹏伟
2020/09/10
2860
学生成绩管理系统[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/115232.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/11
1.6K0
2023-05-23:如果交换字符串 X 中的两个不同位置的字母,使得它和字符串 Y 相等, 那么称 X 和 Y 两个字符串相似。如果这两个字符串本身是相等的,
2023-05-23:如果交换字符串 X 中的两个不同位置的字母,使得它和字符串 Y 相等,
福大大架构师每日一题
2023/05/23
7510
18级个人训练赛--2
B --Consecutive Integers AtCoder 5037 思路:水题,签到~
杨鹏伟
2020/09/11
3080
算法专题九: 哈希表与字符串
固定一个数, 找前面有没有target - x这个数, 使用哈希表, 每次查找之后把这个数丢入到哈希表中, 哈希表中存储这个数字的下标, 时间复杂度为O(N) , 空间复杂度也为O(N).
用户11317877
2024/10/22
1040
算法专题九: 哈希表与字符串
【算法】动态规划:背包问题
(1) 定义状态 dp[i][j] 表示在前 i 个物品中挑选,总体积不超过 j 的所有选法中,最大的价值。
_小羊_
2025/03/29
810
【算法】动态规划:背包问题
【从零到一的笔试突破】——day1笔试巅峰(6道笔试题)ACM模式让笔试更有感觉
这个程序的目标是计算在给定区间 [L, R] 内,所有数字中数字 2 出现的次数。下面是逐步分析和注释程序的过程:
用户11286421
2024/10/20
1200
【从零到一的笔试突破】——day1笔试巅峰(6道笔试题)ACM模式让笔试更有感觉
【算法】字符串算法技巧系列
String a = “abcdefg” char[] a1= a.toCharArray()
三三是该溜子
2025/01/13
940
【算法】字符串算法技巧系列
华为oj之字符串分割
•连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组; •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
Enjoy233
2019/03/05
6560
Codeforces Round #826 (Div. 3)(A~D)
A. Compare T-Shirt Sizes ---- Origional Link 题目大意: 给定不同衬衫大小的尺寸编号如:S,M,L。 除 M 之外,X 作为尺寸前缀代表其倍数大小。 如:XXL\gt XL,XXS\lt XS。 给定两个代表衬衫尺寸的字符串,判断衬衫大小。 ---- 思想: 签到题。 判断模拟即可。 ---- 代码: #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #in
浪漫主义狗
2022/10/28
3070
Day1 组队竞赛、删除公共字符
分析:本题知识点为 printf 打印格式控制,其中 %s 为打印字符串,而数字可以控制格式长度:其中 . 前的数字表示打印时缩进 N 个空格,而 . 后的数字表示取目标前 M 位字符
北 海
2023/07/01
1160
Day1 组队竞赛、删除公共字符
2023-08-14:用go语言写算法。给出两个长度相同的字符串 str1 和 str2 请你帮忙判断字符串 str1 能不能在
2023-08-14:用go语言写算法。给出两个长度相同的字符串 str1 和 str2,
福大大架构师每日一题
2023/08/29
1370
2023-08-14:用go语言写算法。给出两个长度相同的字符串 str1 和 str2 请你帮忙判断字符串 str1 能不能在
推荐阅读
相关推荐
【C++笔试强训】如何成为算法糕手Day2
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文