zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    11
    10
    09
    08
    201621044079韩烨软件工程作业三
    软工作业二 201621044079韩烨
    软工作业一 201621044079韩烨
    14
    201621044079 week13 网络
    week12 201621044079 流与文件
  • 原文地址:https://www.cnblogs.com/ZefengYao/p/6668795.html
Copyright © 2011-2022 走看看