ACWING 蓝桥杯每一一题 1460. 我在哪 c/c++

9 篇文章 0 订阅

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;
    
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值