题目描述
对给定的一个字符串,找出有重复的字符,并给出其位置,如: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;
}