1.
2.
例如若 s="aabbc",那么
你能帮帮小红吗?
输入一个仅由小写字母组成的字符串,长度不超过 200000。
如果无解,请输出 -1。
否则输出任意合法的字符串。
aabbc
cbaca
"bcacb"等字符串也是合法的构造。
#include <iostream>
#include <vector>
#include <unordered_set>
#include <unordered_map>
using namespace std;
unordered_set<char> uset;
unordered_map<char, char> umap;
int main() {
string str;
cin >> str;
for (char ch : str)
uset.insert(ch);
if (uset.size() == 1)
cout << "-1\n";
else {
vector<char> lib;
for (auto ch : uset) lib.push_back(ch);
int n = lib.size();
for (int i = 0; i < n; i ++) umap[lib[i]] = lib[(i + 1) % n];
for (char ch : str)
cout << umap[ch];
cout << endl;
}
return 0;
}
// 64 位输出请用 printf("%lld")
c = list(input())
cnt = list(set(c))
vis = [0] * len(cnt)
if len(cnt) < 2:
print(-1)
else:
t = []
for x in c:
ok = False
for i in range(len(vis)):
if vis[i] == 0 and cnt[i] != x:
t.append(cnt[i])
vis[i] = 1
ok = True
break
if sum(vis) == len(vis) and not ok:
if cnt[0] != x:
t.append(cnt[0])
else:
t.append(cnt[1])
print("".join(t))
# 将输入字符串转换为字符列表
s = list(input())
# 初始化用于存储转换后字符的列表
t = []
# 初始化用于跟踪输入字符串中唯一字符的列表
char_set = []
# 初始化用于存储字符到字符映射的字典
char_map = {}
# 遍历输入字符串中的每个字符
for i in s:
# 如果字符不在char_set中,则将其添加进去
if i not in char_set:
char_set.append(i)
# 检查char_set中的字符数量
# 如果少于2个字符,则无法进行有效的映射,输出-1
if len(char_set) < 2:
print(-1)
else:
# 创建字符到字符的映射
for i in range(len(char_set)):
# 如果是最后一个字符,则将其映射回第一个字符,形成循环
if i == (len(char_set) - 1):
char_map[char_set[i]] = char_set[0]
else:
# 否则,将字符映射到下一个字符
char_map[char_set[i]] = char_set[i + 1]
# 应用映射到输入字符串中的每个字符
for i in s:
# 使用char_map将字符转换为其映射字符,并添加到结果列表t中
t.append(char_map[i])
# 将结果列表t中的字符连接成一个字符串并打印
print("".join(t))
#include <bits/stdc++.h>
using namespace std;
struct node
{
char ch;
int cnt;
};
bool operator <(node x,node y)
{
return x.cnt<y.cnt;
}
priority_queue <node> q;
queue <char> q2[500];
int a[500];
int main() {
string s;
cin>>s;
for(int i=0;i<s.size();i++)
a[s[i]]++;
for(int i=0;i<400;i++)
if(a[i])
q.push((node){char(i),a[i]});
while(q.size()>=2)
{
node x,y;
x=q.top();
if(x.cnt==1) break;
q.pop();
y=q.top();
q.pop();
x.cnt--,y.cnt--;
q2[y.ch].push(x.ch);
q2[x.ch].push(y.ch);
if(x.cnt) q.push(x);
if(y.cnt) q.push(y);
}
if(q.size()<=1)
{
cout<<"-1";
return 0;
}
char st=q.top().ch,lst=st;
q.pop();
while(!q.empty())
{
node t=q.top();
q2[t.ch].push(lst);
q.pop();
lst=t.ch;
}
q2[st].push(lst);
for(int i=0;i<s.size();i++)
{
char ch=q2[s[i]].front();
q2[s[i]].pop();
s[i]=ch;
}
cout<<s;
} 附上加强版(即考虑数量)的样例 aabccd cbcada aaabb -1
#include <iostream>
#include <iterator>
#include <queue>
#include <type_traits>
#include <unordered_map>
#include <unordered_set>
#include <vector>
using namespace std;
struct node{
node(char c, int count): c(c), count(count){}
char c;
int count{0};
};
int main() {
std::string s;
std::cin >> s;
std::unordered_set<char> set;
for(auto c : s)
{
set.emplace(c);
}
if(set.size() == 1)
{
std::cout << -1;
return 0;
}
auto Compare = [](const node& a, const node& b){
return a.count >= b.count;
};
std::priority_queue<node, std::vector<node>, decltype(Compare)> list(Compare);
for(auto c : set)
{
node nod(c, 0);
list.emplace(nod);
}
std::vector<node> vec;
for(int i = 0; i < s.size();)
{
node now = list.top();
list.pop();
if(now.c != s[i])
{
s[i] = now.c;
now.count++;
list.push(now);
i++;
while(vec.size() > 0)
{
list.push(vec.back());
vec.pop_back();
}
}
else {
vec.push_back(now);
}
}
std::cout << s;
} 蛋疼,java 2001ms,c++ 7ms
#include <bits/stdc++.h>
using namespace std;
string s;
int main() {
cin >> s;
vector<int> chars(26, 0);
for (char &c: s) {
chars[c - 'a']++;
}
int base = -1, base2;
int i = 0;
while (i < 26) {
if (chars[i] > 0) {
base = i;
++i;
break;
}
++i;
}
base2 = base;
while (i < 26) {
if (chars[i] > 0) {
chars[base] = i;
base = i;
}
++i;
}
if (base == base2) {
cout << -1 << endl;
return 0;
} else {
chars[base] = base2;
}
string res = "";
for (char &c: s) {
res += (char)('a' + chars[c - 'a']);
}
cout << res << endl;
return 0;
}
import java.util.HashMap;
import java.util.HashSet;
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.nextLine();
HashSet<Character>set = new HashSet<>();
int len = s.length();
HashMap<Character,Boolean>map = new HashMap<>();
for(int i = 0;i < len;i++)
{
char c = s.charAt(i);
set.add(c);
if(!map.isEmpty() && map.containsKey(c))
{
continue;
}
else
{
map.put(c,true);
}
}
StringBuilder ans = new StringBuilder(len);
for(int i = 0;i < len;i++)
{
char cur = s.charAt(i);
int judge = 0;
for(Character c : set)
{
if(!c.equals(cur))
{
boolean f = map.get(c);
if(f)
{
ans.append(c);
judge = 1;
map.replace(c,false);
break;
}
}
}
if(judge == 0)
{
for(Character c : set)
{
if(!c.equals(cur))
{
ans.append(c);
break;
}
}
}
}
if(ans.length() < 1)
{
System.out.print(-1);
}
else
{
System.out.print(ans.toString());
}
}
} #include <iostream>
#include<cstring>
#include<unordered_set>
#include <vector>
using namespace std;
int main() {
string s;
cin >> s;
int n = s.size();
unordered_set<char> st;
for (char ch : s) {
st.insert(ch);
}
string t;
vector<char> vec(st.begin(), st.end());
int sz = vec.size();
if (sz == 1) {
cout << -1 << endl;
return 0;
}
int idx = 0;
for (int i = 0; i < n; i++) {
if (vec[(idx) % sz] == s[i])
idx++;
t += vec[(idx++) % sz];
}
cout << t << endl;
return 0;
}
// 64 位输出请用 printf("%lld") #include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin >> s;
int n = s.length();
string answer (n, ' ');
unordered_map<char, vector<int>> occu;
for (int i = 0; i < n; i++)
occu[s[i]].push_back(i);
if (occu.size() == 1)
cout << "-1";
else
{
vector<char> v;
for (auto p : occu)
v.push_back(p.first);
for (int i = 0; i < v.size(); i++)
{
int j = (i + 1) % (v.size());
for (auto x : occu[v[j]])
answer[x] = v[i];
}
cout << answer;
}
}