题目描述
对给定的一个字符串,找出有重复的字符,并给出其位置。
输入描述:
输入包括一个由字母和数字组成的字符串,其长度不超过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
应该说这个题是相当变态的,如果没有学过map我都不知道该怎么做!!!这是我见过最难的华科题了!!!
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <map>
using namespace std;
int main()
{
char s[100],ch;
int i,j,k,flag;//flag用来表示当前字符后面是否还有跟自己一样字母的标志位,用于输出,或者endl,顺便吐槽该死的格式
map<char,int> m,f;//m代表字符出现的次数,f为1代表这个字母已经输出过
while(cin>>s)
{
/*对数字、大小写字母出现的次数进行初始化操作*/
for(ch='0';ch<='9';ch++)
m[ch]=f[ch]=0;
for(ch='a';ch<='z';ch++)
m[ch]=f[ch]=0;
for(ch='A';ch<='Z';ch++)
m[ch]=f[ch]=0;
for(i=0;s[i]!='\0';i++)
m[s[i]]++;
/*开始寻找*/
for(i=0;s[i]!='\0';i++)//从头到尾扫描
if(m[s[i]]>=2&&!f[s[i]])//发现出现次数>=2的,并且之前没有输出过的,就要将他输出
{
/*输出之前,得干两件事*/
/*第一,让它的f标志位置1,防止重复输出*/
/*第二,为了格式,要判断这是不是整个串中最后一次出现这个字符,因此引入flag变量来判断*/
f[s[i]]=1;
for(j=0;s[j]!='\0';j++)//从头到尾扫描,就是为了找到和刚才匹配的字母
if(s[j]==s[i])//好,现在找到了一个,那么这个到底是不是最后一个呢?
{
flag=0;//这个flag必须要放在这!因为对于每一个j指向的标识符,我都要判断它是不是最后一个!
for(k=j+1;s[k]!='\0';k++)//从j的后一位开始找,看有没有长得和它一样的,如果有就让flag置1,并退出循环
if(s[k]==s[j])
{
flag=1;
break;
}
if(flag==1)//如果有,说明不是最后一个,就输出逗号,
cout<<s[j]<<":"<<j<<",";
else
cout<<s[j]<<":"<<j<<endl;//不然就说明是最后一个,就需要换行!
}
}
}
}
/*T_T 麻烦的一题终于结束!*/