最短的包含字串

brucehb發表於2017-04-19
給出一個字串,求該字串的一個子串S,S包含A-Z中的全部字母,並且S是所有符合條件的子串中最短的,輸出S的長度。如果給出的字串中並不包括A-Z中的全部字母,則輸出No Solution。
Input
第1行,1個字串。字串的長度 <= 100000。
Output
輸出包含A-Z的最短子串長度。如果沒有符合條件的子串,則輸出No Solution。
Input示例
BVCABCDEFFGHIJKLMMNOPQRSTUVWXZYZZ
Output示例
28

#include <iostream>
#include <string>
#include <string.h>
using namespace std;

int nums[26];

void fun(string &input)
{
    int len = input.length();
    memset(nums, 0, sizeof(nums));
    int count = 0;
    int left = 0; 
    int right = 0;
    int result = len+1;
    while (right < len)
    {
        char cur = input[right];
        
        if (nums[cur-'A'] == 0)
        {
            nums[cur-'A'] = 1;
            count++;
        }
        else
        {
            nums[cur-'A']++;
        }
            
        if (count == 26)
        {
			while (nums[input[left]-'A'] > 1)
			{
				nums[input[left]-'A']--;
				left++;
			}
            int temp = right - left + 1;
            if (temp < result)
            {
                result = temp;
            }
        }
        
        right++;
    }
    
    if (result < len+1)
    {
        cout << result << endl;
        return;
    }
    cout << "No Solution" << endl;
}

int main()
{
    string input;
    cin >> input;
    fun(input);
    
    return 0;
}


相關文章