Newspaper Headline

非常蛋疼的题,做了俩小时,看题解用了一个半小时

给你两个字符串 s1、s2,问至少要多少个s1首尾相接能变成s2

s1拼接之后可以删除一些子串

1|0输入输出样例

输入 #1
abc xyz
输出 #1
-1
输入 #2
abcd dabc
输出 #2
2

复制代码
#include<bits/stdc++.h> using namespace std; set<int>g[26]; string s1,s2; int res=1,p=-1; int main() { cin>>s1>>s2;//读入 for(int i=0;i<s1.size();i++) g[s1[i]-'a'].insert(i);//保存每一个字符出现的位置和次数 for(int i=0;i<s2.size();i++){ if(g[s2[i]-'a'].empty()){//判断 cout<<-1; return 0; } if(g[s2[i]-'a'].upper_bound(p)==g[s2[i]-'a'].end()) res++,p=-1; //这个地方真的很巧妙,从s2开始找s1的位置,找到第一个符合它的位置,然后接上这个一个字符串 //举个例子: abcd,cadc,首先c的位置是一开始就会匹配到的,因为初始值为-1,所以第一次循环肯定是找到c //此时的字符串可以是abcd,也可以看为cd //然后第二次,由于第一次是c的位置,也就是3,我们s2的第二个字符是a,对应s1中的a是第一个位置,那么很明显,我们要在c后面接一个a才行 //接一个abcd,此时字符串是abcabcdd //依次循环就可以了 p=*g[s2[i]-'a'].upper_bound(p);//每次都要更新要寻找的字符 } cout<<res; return 0; }
复制代码

 


__EOF__

本文作者Sakurajimamai
本文链接https://www.cnblogs.com/o-Sakurajimamai-o/p/17476070.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   o-Sakurajimamai-o  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
-- --
点击右上角即可分享
微信分享提示