-
题目: 找位置
问题描述
对给定的一个字符串,找出有重复的字符,并给出其位置。
输入格式
输入包括一个由字母和数字组成的字符串,其长度不超过100。
输出格式
可能有多组测试数据,对于每组数据,
按照样例输出的格式将字符出现的位置标出。
1、下标从0开始。
2、相同的字母在一行表示出其出现过的位置。
样例输入
abcaaAB12ab12
样例输出
a:0,a:3,a:4,a:9
b:1,b:10
1:7,1:11
2:8,2:12
样例说明
给定字符串中重复的字母有a,b,1,2,依次输出上述每个字母在字符串中的全部位置。
- 思路建立所有包含可能字符的结构体数组,遍历字符串并修改结构体数组中关于字符个数和位置的成员变量,最后按格式输出结果。
- 代码
#include<iostream> #include<string> #include<queue> using namespace std; typedef struct{ int mark; //字符的ASCII码 int num; //字符的个数 queue<int> add; //队列储存字符的位置 }Char; Char data[62]; void init(){//初始化,放入0-9,A-Z,a-z; int i; for(i = 0;i < 10;i++){ data[i].mark = '0'+i; data[i].num = 0; } for(i = 10;i < 62;i++){ data[i].mark = 'A'+i; data[i+26].mark = 'a'+i; data[i].num = data[i+26].num = 0; } } int main(){ init(); string str; cin>>str; int i,k; for(i = 0;i < str.size();i++){ if(str[i] < 'A'){ k = str[i] - '0'; } else if(str[i] < 'a'){ k = str[i] - 'A' + 10; } else if(str[i] > 'Z'){ k = str[i] - 'a' + 36; } data[k].num++; data[k].add.push(i); } for(i = 0;i < str.size();i++){ if(str[i] < 'A'){ k = str[i] - '0'; } else if(str[i] < 'a'){ k = str[i] - 'A' + 10; } else if(str[i] > 'Z'){ k = str[i] - 'a' + 36; } if(data[k].add.size() > 1){//当字符有重复时输出,输出后该字符的储存位置的队列清空了 while(!data[k].add.empty() && data[k].add.size() > 1){ cout<<str[i]<<':'<<data[k].add.front()<<','; data[k].add.pop(); } cout<<str[i]<<':'<<data[k].add.front()<<endl; data[k].add.pop(); } } return 0; }
- Tip:ASCII码中大写字母在小写字母前面排着。