4.1460. 我在哪?
-
题目描述
-
思路:
- 列出区间长度为1的字符 A B C D A B C ,列出区间长度为2的字符 AB BC CD … 一直到列出区间长度为n的字符
- 将字符 存入 set容器中 如果容器的size 等于 n - len + 1 , 就代表在长度为len 的字符区间中 , 不存在相同的字符串 -》任意连续k个字符序列 可以确定位置
- 记录此时set容器字符的长度输出即可
-
代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<set>
using namespace std;
const int N = 110;
char str[N];
int main(){
int n ;
cin >> n;
cin >> str+1;
int length = 0;
//首先按照区间长度从小到大枚举所有状态 ,
//比如 len = 2 ,求出[1,2] [2,3] [3,4] [4,5]
// len = 3 , 求出[1,3] [2,4] [3,5]
for (int len = 1; len <= n; len++) {
//按照起点从小到大枚举所有状态
set<string> settable;
for (int i = 1; i + len - 1 <= n; i++) {
//确定左右区间
//将字符进行组装
string res;
for(int j = i ; j <= i + len - 1 ;j++){
res += str[j];
}
if(settable.count(res) < 1){
settable.insert(res);
} ///settable.count(res) >=1 就代表字符不止出现一次 删除元素 ,并进行下个长度的循环
else{
settable.erase(res);
break;
}
if(settable.size() == n - len + 1){
length = len;
cout << length;
return 0 ;
}
}
}
//auto iter = settable.begin();
//cout << (*iter).length() << endl;
}