문자열 s가 있다고 가정하고 모든 회문 순열을 찾아야 하고 반복은 없을 것입니다. 회문 순열이 없으면 단순히 빈 문자열을 반환합니다.
따라서 입력이 "aabb"와 같으면 출력은 ["abba", "baab"]
가 됩니다.이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
ret 배열 정의
-
solve() 함수를 정의하면 s, sz, 하나의 정렬되지 않은 맵 m, idx가 0으로 초기화,
-
sz가 0과 같으면 -
-
ret 끝에 s 삽입
-
반환
-
-
evenFound :=거짓
-
방문한 한 세트 정의
-
m의 각 키-값 쌍에 대해 다음을 수행합니다. -
-
값이 0이면 -
-
(1씩 증가)
-
다음 부분은 무시하고 다음 반복으로 건너뜁니다.
-
-
그렇지 않으면 값이 1과 같을 때 -
-
oddChar :=키
-
-
그렇지 않으면
-
키를 방문하지 않으면
-
다음 부분은 무시하고 다음 반복으로 건너뜁니다.
-
-
s[idx] :=키
-
s[크기 s - 1 - idx] =그것의 키
-
evenFound :=사실
-
m[키] :=m[키] - 2
-
풀다(s, sz - 2, m, idx + 1)
-
m[키] :=m[키] + 2
-
방문 키에 삽입
-
-
(1씩 증가)
-
-
evenFound가 거짓이면 -
-
s[idx] :=oddChar
-
풀다(s, sz - 1, m, idx + 1)
-
-
주요 방법에서 다음을 수행하십시오 -
-
하나의 맵 cnt 정의
-
n :=s
의 크기 -
temp :=빈 문자열
-
initialize i :=0의 경우, i
-
(cnt[s[i]]를 1씩 증가)
-
temp :=임시 연결 " * "
-
-
홀수Cnt :=0
-
cnt의 각 키-값 쌍에 대해 다음을 수행합니다. -
-
값이 홀수일 때 oddCount 증가
-
(1씩 증가)
-
-
만일 oddCnt> 1이면 -
-
리턴 렛
-
-
해결(온도, n, cnt)
-
리턴 렛
예시
더 나은 이해를 위해 다음 구현을 살펴보겠습니다. −
#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, ]