??博客主頁:PH_modest的博客主頁
??當前專欄:每日一題
??其他專欄:
?? 每日反芻
?? C++跬步積累
?? C語言跬步積累
??座右銘:廣積糧,緩稱王!
一.題目描述
題目大意:給你一串由1、2、3組成的數(shù)組,讓你求一個最短的子串,要求這個子串包含1、2、3
題目鏈接:B. Ternary String (Educational Codeforces Round 87 (Rated for Div. 2))
二.思路分析
- 雙指針
- 用指針L,R來遍歷數(shù)組,判斷L和R區(qū)間內是否有滿足條件的字串,如果有將它和上一次的比較存下較小的,然后左指針L往右移動,繼續(xù)判斷,縮小范圍
(小寫的L不太看得清,就用大寫的方便友友們看思路)
三.代碼展示
//雙指針
//用指針l,r來遍歷數(shù)組,判斷l(xiāng)和r區(qū)間內是否有滿足條件的字串,如果有將它和上一次的比較存下較小的,然后左指針l往右移動,繼續(xù)判斷,縮小范圍
//
#include<iostream>
#include<cstring>
#define int long long
using namespace std;
char s[200020];
void solve()
{
int a=0,b=0,c=0;//記錄1,2,3出現(xiàn)的次數(shù)
int l=0,r=0;
int mins=1e9;
cin>>s;
while(r<=strlen(s))//由于數(shù)據較小,可以直接遍歷
{
if(a&&b&&c)//處理這段包含1、2、3的數(shù)列,將l往后移動一個,并且減去原來l位置上數(shù)字的個數(shù)
{
if(s[l]=='1')a--;
if(s[l]=='2')b--;
if(s[l]=='3')c--;
l++;
}
else//如果還沒有找到一段包含1,2,3的序列,r就繼續(xù)往后找
{
if(s[r]=='1') a++;
if(s[r]=='2') b++;
if(s[r]=='3') c++;
r++;
}
if(a&&b&&c)//a,b,c都不為0說明當前序列包含了1,2,3
{
int ret=r-l;//計算當前序列的長度
mins=min(ret,mins);//和上一次進行比較,存儲較小的值
}
}
if(mins==1e9)//如果mins沒有變還是原來賦值的1e9,說明數(shù)組中沒有這樣的序列,直接返回0
{
cout<<"0"<<"\n";
}
else
{
cout<<mins<<"\n";
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin>>t;
while(t--)
{
solve();
}
return 0;
}
最后:
每日一題系列旨在養(yǎng)成刷題的習慣,所以對代碼的解釋并不會特別詳細,但足夠引導大家寫出來,選的題目都不會特別難,但也不是特別簡單,比較考驗大家的基礎和應用能力,我希望能夠將這個系列一直寫下去,也希望大家能夠和我一起堅持每天寫代碼。
之后每個星期都會不定期更新codeforces和atcoder上的題目,想要學習算法的友友們千萬別錯過了,有什么疑問歡迎大家在評論區(qū)留言!
今天晚上cf有div.3的比賽,想第一時間看到題目解析的就趕緊關注我呦~
之后基本上每場比賽比完第二天都會出前幾題的題目解析哦~文章來源:http://www.zghlxwxcb.cn/news/detail-604958.html
在這里送大家一句話:廣積糧,緩稱王!文章來源地址http://www.zghlxwxcb.cn/news/detail-604958.html
到了這里,關于【每日一題】—— B. Ternary String (Educational Codeforces Round 87 (Rated for Div. 2))的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!