题解 | #小红的字符串构造#
小红的字符串构造
https://www.nowcoder.com/practice/3e4b4dabc2e444e384c3ae62ac7dd84e
#include <iostream>
#include <vector>
#include <map>
using namespace std;
int main() {
string str;
char ch1 = 0, ch2 = 0;
while (cin >> str) { // 注意 while 处理多个 case
map<char, int> mp;
for (char it : str) {
mp[it] = 1;
}
if (mp.size() <= 1) {
cout << "-1" << endl;
return 0;
}
vector<char> vec;
for (int i = 0; i < 26; ++i) {
if (mp['a' + i] == 1) {
vec.push_back('a' + i);
}
}
int i = 0;
int j = vec.size() - 1;
for (char it : str) {
// 全部输出之之后乱输出即可;
// 放在开始,保证i、j不超出范围
if (i > j) {
if (vec[0] != it) {
cout << vec[0];
} else {
cout << vec[1];
}
continue;
}
// 前后两个指针,必定有一个是不同字符
// 如果一个指针,需要单独处理跳过的情况
if (vec[i] != it) {
cout << vec[i];
++i;
} else if (vec[j] != it) {
cout << vec[j];
--j;
} else {
cout << vec[0];
}
}
}
}
// 64 位输出请用 printf("%lld")
考点一:map,或这26数组,hash。
考点二:输出,如何高效准确的把所有的字母都使用上,我的方法是从前和从后两个指针,交替输出。
这样可以做到,一边相同时可以使用另外一边。
而且不同记录那个是相同的,但是存在的一个问题是,如果从前和从后相遇,且恰好那个元素相同需要单独考虑。


阿里云成长空间 741人发布