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