51nod 1127 最短的包含字串(尺取法)

2022-05-26 19:42:10 字數 1106 閱讀 2154

給出乙個字串,求該字串的乙個子串s,s包含a-z中的全部字母,並且s是所有符合條件的子串中最短的,輸出s的長度。如果給出的字串中並不包括a-z中的全部字母,則輸出no solution。

輸入

第1行,1個字串。字串的長度 <= 100000。

輸出

輸出包含a-z的最短子串s的長度。如果沒有符合條件的子串,則輸出no solution。

輸入樣例

bvcabcdeffghijklmmnopqrstuvwxzyzz

輸出樣例

28本題要求輸出a-z的最短區間子串s的長度,可以使用尺取法(即雙指標)法寫題,該演算法的複雜度是o(n),尺取法即設定兩個變數指向一前一後,遍歷陣列即可,貼ac**

#include

using

namespace std;

string str;

int cnt[30]

;const

int _max=

1e5+5;

intmain()

if(t<26)

cout<<

"no solution"

cout

}

題解:開始定義start,即後面的指標,t=0,t是區間長度的計數器,ans是區間長度,也就是答案,因為要對ans和長度取最小值,所以一開始ans直接設max,cnt即計數器陣列,他的下標0-25記錄的是字母a-z出現的次數,首先將cnt陣列全部置0,輸入字串。在for迴圈中,剛開始的cnt計數器陣列,如果cnt[i]的值為0,就說明編號為i+1的字母沒出現過,t++,並且當前的編號為i+1的下標加一,當走到第一while語句時,開始判斷start,即第乙個指標,cnt陣列中start指向的元素是不是出現了一次以上,如果是,則cnt[str[start]-『a』]減一,並且指標後移,走到 i f 時,判斷26個字母是不是都出現過了,如果都出現過,則開始取ans和區間長度(i-start+1)的最小值。退出迴圈,若t<26,則說明26個字母沒有都出現過,輸出no solution,反之輸出ans。

51NOD 1127 最短的包含字串

傳送門 給出乙個字串,求該字串的乙個子串s,s包含a z中的全部字母,並且s是所有符合條件的子串中最短的,輸出s的長度。如果給出的字串中並不包括a z中的全部字母,則輸出no solution。input 第1行,1個字串。字串的長度 100000。output 輸出包含a z的最短子串長度。如果沒...

51nod1127 最短的包含字串

給出乙個字串,求該字串的乙個子串s,s包含a z中的全部字母,並且s是所有符合條件的子串中最短的,輸出s的長度。如果給出的字串中並不包括a z中的全部字母,則輸出no solution。收起第1行,1個字串。字串的長度 100000。輸出包含a z的最短子串s的長度。如果沒有符合條件的子串,則輸出n...

51Nod1127 最短的包含字串

給出乙個字串,求該字串的乙個子串s,s包含a z中的全部字母,並且s是所有符合條件的子串中最短的,輸出s的長度。如果給出的字串中並不包括a z中的全部字母,則輸出no solution。二分。include include include include include include includ...