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