对给定的一个字符串,找出有重复的字符,并给出其位置,如:
输入:
abcaaAB12ab12
输出:
a:0,a:3,a:4,a:9
b:1,b:10
1:7,1:11
2:8,2:12
ANSWER1:
思路:这题我没用很多技巧性的方法,使用的是最简单的方法,先构造一个数组int re[101]={0}在后续遍历中记录对应下标字符是否重复,若重复,re[i]=1;然后再遍历一次,构造数组prin[],记录对应下标字符哪些是已经输出了,就不用再比较这些,有了re[]的帮助,这次直接找重复的字符并输出。
代码:
#include <iostream>
#include<string.h>
using namespace std;
int main()
{
char ch[101];
while(cin>>ch){
int len=strlen(ch);
int re[101]={0},prin[101]={0};//re[]记录字符是否重复,prin[]记录字符是否被输出
for(int i=0;i<len;i++){
for(int j=i+1;j<len;j++){
if(re[j]==0&&ch[i]==ch[j]){//若存在于ch[i]相等的且ch[j]之前没有被记录重复,则令re[i]=re[j]=1
re[i]=1;
re[j]=1;
}
}
}
/*
for(int i=0;i<len;i++){
cout<<re[i]<<" "<<endl;
}
*/
for(int i=0;i<len;i++){
if(re[i]==1&&prin[i]==0){//若遍历到标记重复且还未输出的字符,直接输出,并置输出标志prin[]为1
cout<<ch[i]<<":"<<i;
prin[i]=1;
for(int j=i+1;j<len;j++){//从重复点往后继续遍历,遇与ch[i]相同的字符,输出,并置输出标志prin[]为1
if(ch[i]==ch[j]&&prin[j]==0){
prin[j]=1;
cout<<","<<ch[i]<<":"<<j;//并且格外注意格式
}
}
cout<<endl;
}
}
}
return 0;
}
ANSWER2:
参考原文:https://www.cnblogs.com/parzulpan/p/9923096.html
思路:类似于kmp算法,两层for循环,第一层循环i从头遍历到尾,相当于就浏览一遍是什么字符,并设置了哨兵flag,第一层遍历开始时,设置flag为true,表示这是对i的第一次访问,第二层从i+1开始遍历,若有与i处相同的字符,先输出i处字符,并设置哨兵为假,输出j处字符,并令输出处为’*’;
代码:
#include <iostream>
#include<string.h>
using namespace std;
int main()
{
char ch[101];
while(cin>>ch){
int len=strlen(ch);
for(int i=0;i<len;i++){
bool flag=true;
if(ch[i]=='*'){//输出的都打上*,表示已输出
continue;
}
for(int j=i+1;j<len;j++){
if(ch[i]==ch[j]){
if(flag){//i处设置哨兵,避免ch[i]重复输出
cout<<ch[i]<<":"<<i;
flag=false;//输出后即令哨兵为假避免重复输出,也为下一次循环做铺垫
}
cout<<","<<ch[j]<<":"<<j;
ch[j]='*';
}
}
if(!flag){//注意这个地方的换行,我掉这坑了
cout<<endl;
}
}
}
return 0;
}