Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).
For example,
S = "ADOBECODEBANC"
T = "ABC"
Minimum window is "BANC"
.
Note:
If there is no such window in S that covers all characters in T, return the emtpy string ""
.
If there are multiple such windows, you are guaranteed that there will always be only one unique minimum window in S.
不會做,看了別人的程序,自己按他的思路寫了個。當作學學別人的編程技巧了。
class Solution {
public:
string minWindow(string s, string t) {
int slength=s.size();
int tlength=t.size();
int alphArray[128];
fill_n(alphArray,128,-slength);
int minS,minL=INT_MAX;
for(int i=0;i<tlength;++i)
alphArray[t[i]]=alphArray[t[i]]>0?(++alphArray[t[i]]):1;
int start=0;
for(int i=0,count=tlength;i<slength;++i)
{
if((--alphArray[s[i]]>=0) && (--count==0))
{
while(alphArray[s[start]]<=-slength || (++alphArray[s[start]]<=0))
++start;
if(minL>i-start+1)
{
minL=i-start+1;
minS=start;
}
count=1;//因爲丟棄了一個
++start;
}
}
return minL==INT_MAX?"":s.substr(minS,minL);
}
};
以上程序中包括了兩個頭文件:<limits.h>、<algorithm>;前者定義了部分數據類型的極限取值(INT_MAX),後者是STL中相關算法(fill_n)
limits.h頭文件內容如下:
C語言的數據類型有四種:整形、浮點型、指針、聚合類型(數組、結構等),其中整形家族的變量包括:char, int, short, long, enum等。浮點數家族包括float, double等。
limits.h頭文件對整形家族變量範圍進行了宏定義。float.h定義了FLT_MAX, FLT_MIN, DBL_MAX, DBL_MIN。下面這張表搬運自維基百科。
Name | Description | Typical value |
ANSI standard minimum- or maximum magnitude value |
|
---|---|---|---|---|
CHAR_BIT |
Number of bits in a char | 8 | ≥+8 | |
SCHAR_MIN |
Minimum value for a signed char | –128 | ≤–127 | |
SCHAR_MAX |
Maximum value for a signed char | +127 | ≥+127 | |
UCHAR_MAX |
Maximum value for an unsigned char | +255 | ≥+255 | |
CHAR_MIN |
Minimum value for a char | –128 |
≤–127 (if char is represented as asigned char ; otherwise ≤0) |
|
CHAR_MAX |
Maximum value for a char | +127 |
≥+127 (if char is represented as asigned char ; otherwise ≥+255) |
|
MB_LEN_MAX |
Maximum multi byte length of a character across all locales | varies, usually at least 4 | ≥+1 | |
SHRT_MIN |
Minimum value for a short int | –32,768 | ≤–32,767 | |
SHRT_MAX |
Maximum value for a short int | +32,767 | ≥+32,767 | |
USHRT_MAX |
Maximum value for an unsigned short int | +65,535 | ≥+65,535 | |
INT_MIN |
Minimum value for an int | –2,147,483,648 | ≤–32,767 | |
INT_MAX |
Maximum value for an int | +2,147,483,647 | ≥+32,767 | |
UINT_MAX |
Maximum value for an unsigned int | +4,294,967,295 | ≥+65,535 | |
LONG_MIN |
Minimum value for a long int | 32 bit compiler | –2,147,483,648 | ≤–2,147,483,647 |
64 bit compiler | –9,223,372,036,854,775,808 | |||
LONG_MAX |
Maximum value for a long int | 32 bit compiler | +2,147,483,647 | ≥+2,147,483,647 |
64 bit compiler | +9,223,372,036,854,775,807 | |||
ULONG_MAX |
Maximum value for an unsigned long int | 32 bit compiler | +4,294,967,295 | ≥+4,294,967,295 |
64 bit compiler | +18,446,744,073,709,551,615 | |||
LLONG_MIN |
Minimum value for a long long int | –9,223,372,036,854,775,808 | ≤-9,223,372,036,854,775,807 | |
LLONG_MAX |
Maximum value for a long long int | +9,223,372,036,854,775,807 | ≥+9,223,372,036,854,775,807 | |
ULLONG_MAX |
Maximum value for an unsigned long long int | +18,446,744,073,709,551,615 |
≥+18,446,744,073,709,551,615 |