版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/grllery/article/details/82708244
# -*- coding: utf-8 -*-
"""
# @Time : 2018/9/14 20:17
# @Author : shen
# @FileName: sogou2018.py
"""
import sys
print("输入数据个数:")
in_num = int(sys.stdin.readline().strip('\n'))
line = []
for i in range(in_num):
s1 = sys.stdin.readline().strip('\n')
line.append(s1)
line_unique = list(set(line)) # 该数据序列中独特的数据,去重
line_unique_num = line_unique.__len__()
max_len = min(in_num, 10000) # 最小区间长度的最大值
find_number = 0 # 查找到最小子串的个数
start_index = [] # 查找到最小子串的起始位置
# 循环可能的最小区间长度
for i in range(line_unique_num, max_len+1):
min_length = i
for j in range(0, in_num):
sub_line = line[j: j + i] # python有自动的溢出保护,不用边界判断
sub_line_unique = list(set(sub_line)) # 子串数据去重
# 子串数据去重后的长度 等于 整个数据序列去重的长度, 则找到最小区间长度
if sub_line_unique.__len__() == line_unique_num:
find_number += 1
start_index.append(j+1) # 因为数字序列的编号从1开始
if find_number != 0:
break
print(min_length, find_number)
for i in start_index:
print('[%d,%d]' % (i, i + min_length - 1), end=' ')
"""
# 测试1
10
1
1
3
4
6
6
5
1
3
3
6 3
[2,7] [3,8] [4,9]
"""
"""
# 测试2
输入数据个数:
3
1
2
3
3 1
[1,3]
"""
C++
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<vector>
#include<string>
#include<set>
using namespace std;
typedef int DT;
/********************************/
/*2018年9月15日15点56分 */
/********************************/
int main()
{
size_t num;
cin >> num;
vector<DT> seq(num, 0);
for (size_t i = 0; i < num; i++)
{
cin >> seq[i];
}
set<DT> seq_unique(seq.begin(), seq.end());
size_t seq_unique_size = seq_unique.size();
size_t max_len = num > 10000 ? 10000 : num; //最小区间长度的最大值
int find_number = 0; //查找到最小子串的个数
vector<DT> start_index; //查找到最小子串的起始位置
int min_len = -1;
for (size_t i = seq_unique_size; i <= max_len; i++) //最小区间长度可能的值
{
min_len = i;
for (size_t j = 0; j < num - i + 1; j++) //注意边界判断
{
set<DT> sub_seq(seq.begin() + j, seq.begin() + j + i);
size_t sub_seq_size = sub_seq.size();
if (sub_seq_size == seq_unique_size)
{
find_number++;
start_index.push_back(j + 1);
}
}
if (find_number != 0)
{
break;
}
}
printf("%d %d\n", min_len, find_number);
for (size_t i = 0; i < start_index.size(); i++)
{
printf("[%d,%d] ", start_index[i], start_index[i] + min_len - 1);
}
printf("\n");
}