序文:
21.再テストに参加できるかどうかに関係なく、道路に書かれたゴミコードを記録します。もともと「AlgorithmNotes」をかじったのですが、やりすぎたので、Kingway ComputerTestGuideに変更しました。
タイトル説明:
特定の文字列について、繰り返される文字を見つけて、次のようにそれらの位置を指定します。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行に表示された位置を示します。
回答
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<stdio.h>
using namespace std;
struct num {
char letter;
vector<int> loc;
};
int find_letter(vector<num> vi,char str) {
//确定数组中是否已有该字母,无返回-1,有则返回下标
for (int i = 0; i < vi.size(); i++)
if (vi[i].letter == str)
return i;
return -1;
}
int main()
{
string str;
int temp;
while (cin >> str) {
vector<num> vi;
for (int i = 0; i < str.length(); i++) {
temp = find_letter(vi, str[i]);
if (temp == -1) {
//首次出现字母
num tool;
tool.letter = str[i];
tool.loc.push_back(i);
vi.push_back(tool);
}
else
vi[temp].loc.push_back(i); //非首次出现则记录字符串中下标
}
for (int i = 0; i < vi.size(); i++) //删除只出现一次的字符
if (vi[i].loc.size() == 1) {
vi.erase(vi.begin() + i, vi.begin() + i + 1);
i--;
}
for (int i = 0; i < vi.size(); i++) {
for (int j = 0; j < vi[i].loc.size(); j++)
if (j != vi[i].loc.size() - 1)
cout << vi[i].letter << ':' << vi[i].loc[j] << ',';
else
cout << vi[i].letter << ':' << vi[i].loc[j];
cout << endl;
}
}
return 0;
}
二次元ベクトルの実装