找位置

題目描述

對給定的一個字符串,找出有重複的字符,並給出其位置,如: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;
}

發佈了112 篇原創文章 · 獲贊 7 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章