假设我们有一个字符串s,我们必须找到它的所有回文排列,就不会重复。如果没有回文排列,则只需返回空字符串。
因此,如果输入类似于“ aabb”,则输出将为[“ abba”,“ baab”]
为了解决这个问题,我们将遵循以下步骤-
定义数组ret
定义一个函数solve(),它将使用s,sz,一个无序映射m,idx将其初始化为0,
如果sz与0相同,则-
在ret的末尾插入s
返回
evenFound:=假
定义一组参观
对于m的每个键值对,执行-
如果没有访问它的键,则
s [idx]:=它的键
s [s的大小-1-idx] =它的键
evenFound:=真
m [它的键]:= m [它的键]-2
解决(s,sz-2,m,idx +1)
m [它的键]:= m [它的键] + 2
将其键插入访问
忽略以下部分,跳至下一个迭代
奇数:=它的关键
(增加1)
忽略以下部分,跳至下一个迭代
如果它的值为零,则-
否则,当它的值等于1时,则-
除此以外
(增加1)
如果evenFound为false,则-
s [idx]:=奇数字符
解决(s,sz-1,m,idx +1)
从主要方法中执行以下操作-
定义一个映射
n:= s的大小
temp:=空字符串
对于初始化i:= 0,当i <n时,更新(将i增加1),执行-
(将cnt [s [i]]增加1)
temp:= temp并置“ *”
奇数:= 0
对于cnt中的每个键值对,请执行以下操作-
当其值为奇数时增加奇数
(增加1)
如果oddCnt> 1,则-
返回ret
解(temp,n,cnt)
返回ret
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto< v){
cout << "[";
for(int i = 0; i<v.size(); i++){
cout << v[i] << ", ";
}
cout << "]"<<endl;
}
class Solution {
public:
vector<string> ret;
void solve(string s, int sz, unordered_map<char,int>& m, int idx = 0){
if (sz == 0) {
ret.push_back(s);
return;
}
bool evenFound = false;
char oddChar;
unordered_map<char, int>::iterator it = m.begin();
set<char> visited;
while (it != m.end()) {
if (!it->second) {
it++;
continue;
}
else if (it->second == 1) {
oddChar = it->first;
}
else {
if (visited.count(it->first))
continue;
s[idx] = it->first;
s[s.size() - 1 - idx] = it->first;
evenFound = true;
m[it->first] -= 2;
solve(s, sz - 2, m, idx + 1);
m[it->first] += 2;
visited.insert(it->first);
}
it++;
}
if (!evenFound) {
s[idx] = oddChar;
solve(s, sz - 1, m, idx + 1);
}
}
vector<string< generatePalindromes(string s){
unordered_map<char,int> cnt;
int n = s.size();
string temp = "";
for (int i = 0; i < n; i++) {
cnt[s[i]]++;
temp += "*";
}
int oddCnt = 0;
unordered_map<char, int>::iterator it = cnt.begin();
while (it != cnt.end()) {
oddCnt += (it->second & 1);
it++;
}
if (oddCnt > 1)
return ret;
solve(temp, n, cnt);
return ret;
}
};
main(){
Solution ob;
print_vector(ob.generatePalindromes("aabb"));
}"aabb"
输出结果
[baab, abba, ]