hdu 5578 Friendship of Frog
2024-09-02 14:02:01
题意:给定一行字符串(都是小写字母),每一个字符都代表一只青蛙以及其国籍,若字符串中出现两个字符相同,则这两个字符所代表的青蛙来自同一国度,可称之为好朋友。
现在需要找到距离最近的好朋友并输出他们的距离。
思路:建立一个map映射表,映射关系为:字符<->字符所在字符串的位置,从字符串头部到尾部依次进行扫描,每扫到一个字符,可以找一找map表中有没有出现该字符,若没出现过则在
表中建立这个字符的关系,若map表中有该字符的记录,那么说明当前字符串代表的青蛙找到了一个朋友,可以计算他与朋友的距离,并更新最短距离。之后map表也要更新这个字符的信息,
即把字符所在位置改为当前位置以方便后续的操作。
AC代码:
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<algorithm>
#include<string>
#include<set>
#include<map>
using namespace std;
string s;
map<char, int>m;//coutry<->position
int main() {
int T;
scanf("%d",&T);
int k = ;
while (T--) { k++;
cin >> s;
int dis = INT_MAX;
m.clear();//每次用完需要清空map表
for (int i = ; i < s.size(); i++) {
map<char,int>::iterator it = m.find(s[i]);
if (it != m.end()) {//集合中找到了这只青蛙的同伴
int distance = i - it->second;
if (distance < dis)dis = distance;
m.erase(s[i]);//更新青蛙位置
m.insert(make_pair(s[i], i));
}
else {
m.insert(make_pair(s[i],i));//新元素,记录位置
}
}
if (dis >= s.size())
printf("Case #%d: -1\n", k);
else
printf("Case #%d: %d\n",k,dis); }
return ;
}
最新文章
- C#winfrom中splitContainer的用法
- html随笔
- C++ 中复杂的声明
- SMB/CIFS协议解析一概述
- C#实现从EXCEL文件读取数据到SqlServer数据库
- Katu Puzzle
- javascript(js)中的substring和substr方法
- Object lifetime
- 全栈JavaScript路(八)得知 CDATASection 种类 节点
- 低功耗蓝牙BLE外围模式(peripheral)-使用BLE作为服务端
- php传输大数据大文件时候php.ini相关设置
- ubuntu文件目录详细介绍
- Java程序员必须掌握的线程知识-Callable和Future
- Pi Hybrids问题
- 6-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案升级篇-优化升级(安装Apache (Web服务器)软件,测试HTTP)
- mysql数据库优化(一)
- encoding and Endian
- CSS-3 新弹性盒模型属性
- mysql存储引擎innodb、myisam区别
- Angular 4.0从入门到实战