对于一个给定的字符串,找出有重复的字符,并给出其位置。
输入样例
abcaaAB12ab12
输出样例
a,1;a,4;a,5;a,10;b,2;b,11;1,8;,1,12;2,9;2,13
注意:最后一个输出后面无分号,且最后要换行
思路
对每个字符,都向后查找,判断是否有重复。同时设置一个数组来记录每一个字符是否已被处理过,避免重复处理。比较简单,将程序逻辑整理清除即可。
代码
#include<iostream>
#include<cstdlib>
#include<string>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
/*
题目描述:
找位置
给定一个字符串,找出有重复的字符,并给出其位置
*/
struct _str{
string s;
bool *rep; //判断这个字符之前是否已被处理过
}str;
void find_repeat(int pos){//对每个位置,都向后查找是否有重复的字符
int flag = 0;
if(str.rep[pos] == false){
for(int i = pos+1; i < (int)str.s.size();i++){
if(str.s[i] == str.s[pos]){
if( !flag ){
if(pos) cout<<";"; //第一个字符前面不用输出";",同时第一个字符的情况只可能在这里输出
cout<<str.s[pos]<<","<<pos+1;
str.rep[pos] = true;
flag = 1;
}
str.rep[i] = true;
cout<<";"<<str.s[i]<<","<<i+1;
}
}
}
}
int main(){
cin>>str.s;
str.rep = new bool [str.s.size()];
memset(str.rep,false,str.s.size());
for(int i = 0; i < (int)str.s.size();i++){
find_repeat(i);
}
cout<<endl;
delete [] str.rep; //注意new和delete要配对使用
system("pause");
return 0;
}