51Nod - 1127 最短的包含字符串

51Nod - 1127 最短的包含字符串

给出一个字符串,求该字符串的一个子串S,S包含A-Z中的全部字母,并且S是所有符合条件的子串中最短的,输出S的长度。如果给出的字符串中并不包括A-Z中的全部字母,则输出No Solution。

Input

第1行,1个字符串。字符串的长度 <= 100000。

Output

输出包含A-Z的最短子串长度。如果没有符合条件的子串,则输出No Solution。

Input示例

BVCABCDEFFGHIJKLMMNOPQRSTUVWXZYZZ

Output示例

28

题解:

   双指针 + 计数数组,可以在 O(n ) 时间内解决。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
const int MAXN = 100000 + 5; 

int vis[26];
char ch[MAXN]; 

int main(){
	freopen("in.txt", "r", stdin); 

	int len, cnt, i, j, ans;
	while(scanf("%s", ch) != EOF){
		getchar();
		len = strlen(ch);
		memset(vis, 0, sizeof(vis));
		i = 0; j = 0;  ans = len + 1;  cnt = 0;
		while(j < len){
			if(vis[ch[j] - ‘A‘] == 0){
				cnt += 1;
			}
			vis[ch[j] - ‘A‘] += 1;
			j++;
			if(cnt == 26){
				while( i<j && vis[ch[i] - ‘A‘] > 1){
					vis[ch[i] - ‘A‘] -= 1;
					i++;
				}
				if( ans > (j - i) ){
					ans = j - i;
				}
			}
		}
		if(ans == len + 1){
			printf("No Solution\n");
		}else{
			printf("%d\n", ans );
		}
	}
	return 0;
}

  

时间: 2024-08-08 09:41:48

51Nod - 1127 最短的包含字符串的相关文章

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

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1127 可以用一个映射,把从头到当前位置的出现了多少个不同的字符计算出来,不断向区间末尾推进,如果包含了A-Z就可以更新最短长度,然后把开头的字符减1,表示向前推进一位. 这样就能在nlogn的时间内出解. 用map或者一个一维数组来映射都可以. 1 #include <iostream> 2 #include <cstdio> 3 #include <

最短的包含字符串 (尺取)

给出一个字符串,求该字符串的一个子串s,s包含A-Z中的全部字母,并且s是所有符合条件的子串中最短的,输出s的长度.如果给出的字符串中并不包括A-Z中的全部字母,则输出No Solution. Input 第1行,1个字符串.字符串的长度 <= 100000. Output 输出包含A-Z的最短子串s的长度.如果没有符合条件的子串,则输出No Solution. Sample Input BVCABCDEFFGHIJKLMMNOPQRSTUVWXZYZZ Sample Output 28 1 #

51Nod1127 最短的包含字符串

Problem 给出一个字符串,求该字符串的一个子串s,s包含A-Z中的全部字母,并且s是所有符合条件的子串中最短的,输出s的长度.如果给出的字符串中并不包括A-Z中的全部字母,则输出No Solution. Solution 二分. Code #include<stdio.h> #include<set> //#include<iostream> #include<algorithm> #include<cstring> #include<

[51NOD1127]最短的包含字符串(尺取法)

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1127 思路:尺取法,一开始我考虑更新右指针,直到遇到一个和l指针指向的字符相同的时候为止,发现这样做ac不了.于是换了一个思路. 一直更新r指针,直到所有字符都出现了一遍后,更新答案和左指针,导致有一个缺口,这时候再更新r指针. 1 /* 2 ━━━━━┒ギリギリ♂ eye! 3 ┓┏┓┏┓┃キリキリ♂ mind! 4 ┛┗┛┗┛┃\○/ 5 ┓┏┓┏┓┃ /

搜索文件或目录中包含字符串的文件 java小程序

package com.ruishenh.spring.test; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Enumeration; import java.

怎么判断字符串a的内容包含字符串b的内容

在vb.net可以使用InStr(a,b)方法来判断字符串a的内容是否包含字符串b的内容. InStr(a, b) 如果a中包含有b则InStr(a, b) 返回一个大于0的值,如果不含有b则返回0.可以通过返回值来判断. c#中可以使用 IndexOf语句 public class Example { public static void Main() { string s1 = "ani\u00ADmal"; string s2 = "animal"; // F

strstr() strpos() 获取db报错,判断报错中是否包含字符串,判断错误类型

model中直接获取添加公司的错误.(公司名称不能重复) $enterprise_id = $this->add($enterprisedata ); $err = $this->getDbError(); $err =="1062:Duplicate entry 'aaa' for key 'enterprise_name'\n [ SQL\u8bed\u53e5 ] : INSERT INTO `t_enterprise` (`enterprise_name`,`enterpri

idea 快捷键以及包含字符串文件搜索

1.idea也有一个类似于eclipse的包含字符串文件搜索(特别实用) idea 里按快捷键:ctrl+H 2.下图是idea的快捷键汇总 3.debug调试 F5:跳入方法   F6:向下逐行调试 F7: 跳出方法  F8:直接跳转到下一个断点,项目一般调试打了断点就直接F8,单步就F6 4.eclipsedebug时进入class源码里(下面是参考网络,未验证) Windows--preferences---debug---里面最后一行有个 Use advanced source look

Substring with Concatenation of All Words, 返回字符串中包含字符串数组所有字符串元素连接而成的字串的位置

问题描述:给定一个字符数组words,和字符串s,返回字符数组中所有字符元素组成的子串在字符串中的位置,要求所有的字符串数组里的元素只在字符串s中存在一次. 算法分析:这道题和strStr很类似.只不过strStr是子串,而这个题是字符串数组里的元素组成的子串,字符串数组里的元素是无序的,但是必须全部包含.所有考虑使用map集合.关键点在于几个临界值,字符串元素在s中重复了怎么做,找到一个符合的子串后怎么做,有字符串元素不匹配怎做. import java.util.ArrayList; imp