hdu 5578 Friendship of Frog

题意:给定一行字符串(都是小写字母),每一个字符都代表一只青蛙以及其国籍,若字符串中出现两个字符相同,则这两个字符所代表的青蛙来自同一国度,可称之为好朋友。

现在需要找到距离最近的好朋友并输出他们的距离。

思路:建立一个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 = 0;
    while (T--) {
        
        k++;
        cin >> s;
        int dis = INT_MAX;
        m.clear();//每次用完需要清空map表
        for (int i = 0; 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
", k);
        else
            printf("Case #%d: %d
",k,dis);
        
    }
    return 0;
}
原文地址:https://www.cnblogs.com/ZefengYao/p/6668795.html