2524 確定子串行 (字串思維)

2021-09-25 15:54:33 字數 1299 閱讀 6713

給你乙個字串ss 和乙個數 kk ,現在如果小 bb 任意選出 kk 個字元刪去,

然後將得到的字串給你,請問你是否一定能確定刪去的所有字元在原串中的位置。

若一定,輸出 certain ,否則輸出 uncertain 。

1≤k≤|s|≤1001≤k≤|s|≤100 ,ss 僅包含小寫字母。

樣例說明:

例如如果小 bb 刪去 s,es,e ,則她告訴你 "nuk" ,那麼你可以確定刪去的是原串的第 11 

個字元和第 55 個字元。無論小 bb 刪去哪兩個字元,你都一定可以確定其在原串的位置。

收起

第一行乙個字串表示 s 。

第二行乙個正整數表示 k 。

一行乙個字串。

若一定,輸出 certain ,否則輸出 uncertain 。

snuke

2

certain
本題,先把題意理清楚,給乙個字串和k,問隨意給出乙個刪去k個字元的串能否確定出

刪後的串中每個字元原來的位置,並不要求確定刪去的每個字元的位置(從刪去的角度來讀題

只要知道哪些位置被刪掉就行了,無需一一對應),例如 abca,2的答案是「yes」。

很多人的做法,判斷原串中是不是有出現次數》=2的字母,另外對k==len的情況特判。

實際上這樣的思路是不對的,還是例子abca,2,顯然答案是「yes」。

正解是找相同字母的最小間隔,如果k>=該間隔,則無法確定,否則可以確定,當然同樣要對

k==len的情況特判,具體為什麼理解的還不是很透徹。

#include#include#include#include#include#include#define ll long long

#define inf 0x3f3f3f3f

using namespace std;

const int n=2e5+100;

const int m=4e5+100;

int arr[n],pos[n];

int main(){

string str;

int k,len,mini;

while(cin>>str>>k){

mini=inf;

memset(pos,0,sizeof(pos));

len=str.length();

for(int i=0;ik||len==k){

cout<<"certain"

C 擷取指定子字串

在tcp通訊中,資料是一直在發的,為了保證我們需要的命令包是完整的,那麼一定會有命令頭和尾,然後再擷取中心的命令資料處理,留下剩下的字串。string s qwer asdf zxcv int startops s.indexof console.writeline startops int end...

替換字串中的指定子串

input 原字串 find 被替換的子串 replacewith 替換字串 string stringreplace const string input,const string find,const string replacewith return strout 在網上搜尋的時候看到好多人都...

確定字串互異

請實現乙個演算法,確定乙個字串的所有字元是否全都不同。這裡我們要求不允許使用額外的儲存結構。給定乙個string inistring,請返回乙個bool值,true代表所有字元全都不同,false代表存在相同的字元。保證字串中的字元為ascii字元。字串的長度小於等於3000。測試樣例 aeiou ...