找位置

题目描述

对给定的一个字符串,找出有重复的字符,并给出其位置,如:abcaaAB12ab12 输出:a,1;a,4;a,5;a,10,b,2;b,11,1,8;1,12, 2,9;2,13。

输入描述:

输入包括一个由字母和数字组成的字符串,其长度不超过100。

输出描述:

可能有多组测试数据,对于每组数据,
按照样例输出的格式将字符出现的位置标出。

1、下标从0开始。
2、相同的字母在一行表示出其出现过的位置。
示例1

输入

abcaaAB12ab12

输出

a:0,a:3,a:4,a:9
b:1,b:10
1:7,1:11
2:8,2:12


这道题的解决思路,我是建立里类似与邻接表的机制。对于每一个字符,建立一个邻接表,每个边结点储存位置信息与顶点表元素,顶点表结点储存边的个数与是否输出过。

输出时,扫描顶点表,如果边的数量大于2且还未输出过,则遍历输出边的信息,同时将改顶点设置为已输出;


代码:

#include <iostream>
#include <string>
using namespace std;

class posNode
{
public:
    char origin;
    int pos;
    posNode *next;

    posNode(char aOrigin , int aPos)
    {
        origin = aOrigin;
        pos = aPos;
        next = NULL;
    }
};

class charNode
{
public:
    int count;
    posNode *next;
    bool flag;
    charNode()
    {
        count = 0;
        next = NULL;
        flag = true;
    }

};

int main()
{
    string a;
    int i;
    charNode *p = new charNode [128];
    while(cin>>a)
    {
        for(i=0;i<a.size();i++)
        {
            posNode *q = p[ a[i] ].next;
            if(q == NULL)
            {
                p[ a[i] ].next = new posNode(a[i],i);
            }
            else
            {
                while(q->next != NULL)
                    q=q->next;
                posNode *newNode = new posNode(a[i],i);
                q->next = newNode;
            }
            p[ int(a[i]) ].count ++;
        }

        for(i=0;i<a.size();i++)
        {
            if( p[a[i]].count >=2 && p[a[i]].flag)
            {
                int flag = 0;
                p[a[i]].flag = false;
                posNode *q = p[a[i]].next;
                while(q!= NULL)
                {
                    if(flag)
                        cout<<",";
                    else
                        flag = 1;
                    cout<<q->origin<<":"<<q->pos;
                    q= q->next;
                }
                cout<<endl;
            }
        }
    }
        return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39304201/article/details/79990934